zoukankan      html  css  js  c++  java
  • Java设计模式

    Java设计模式 单例模式 装饰者模式

    作者 : Stanley 罗昊

    转载请注明出处和署名,谢谢!

    静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/10761604.html

    什么是设计模式

    设计模式其实就是是写了很多代码的人总结出来的经验!

    设计模式是关于一些问题的最佳解决方案;

    也就是说,每一个典型的问题,关于一个典型的问题,他都会总结出来一个最佳的解决方案;

    就比方说医生问诊:

    你挂不同的科室,也就是不同的医生,每个医生都有自己擅长并拿手的治疗方案,关于某一个疾病都有自己独特的解决方案;

    设计模式其实也一样,就是通过大量的代码总结出来的一些问题的最佳解决办法;

    Java的设计模式一共有23种设计模式;

    在这23种设计模式中,你仅掌握3~4种设计模式即可,并且要求能够手写出来

    23种设计模式并分为三大类:

    1.创建型模式【五种】

    工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

    2.结构型模式【七种】

    适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

    3.行为型模式【十一种】

    策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

    设计模式 -- 六大设计原则

    总原则:开闭原则(Open Close Princciple)

    对修改关闭,对扩展开放,所有的设计模式都必须遵循这个原则!

    也就是说,所有的设计模式,你可以扩展它的功能,但是不可以修改它原始的功能;

    六大小原则:

    1.单一职责原则

    不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分;

    2.里氏替换原则

    里氏替换原则中,子类对父类的方法尽量不要重写和重载,因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它;

    3.依赖倒转原则

    这个原则的意思四,每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多张个隔离的接口,比使用单个接口(多个几口方法结合到一个的接口)更好;

    4.迪米特法则(最少知道原则)

    就是说,一个类对自己的依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部,这样当被依赖的类变化时,才能量最小的影响该类;

    6.复合重用原则

    尽量首先使用合成/聚合的方式,而不是使用继承的方式;

    单例设计模式

    单例设计模式是最简单的设计模式

    目的:创建全局唯一的实例对象;

    1.饿汉模式

    在类加载的时候,就创建一个对象,因为就比较饿嘛,上来就创建对象;

    2.懒汉模式

    需要的时候才创建,因为比较懒,你不拿鞭子抽它,他就不动;

    手写单例设计模式

    下面呢,我将创建一个类,这个类,我就把它搞成一个单例设计模式;

    单例设计模式有三点,第一点:私有的构造器;

                                       第二点:私有的静态属性,并且变量类型与类同名;

                                       第三点:共有的创建实例对象的方法(那我这个方法返回的肯定是一个SingleDemo01类型);

    标准的线程安全的单例模式:

    public class SingleDemo01{

    //1.私有的构造器
    
    private SingleDemo01(){}
    
    //2.私有的静态属性
    
    private static SingleDemo01 single;
    
    //3.公有的创建实例对象的方法
    
    public SingleDemo01getInstance(){
    
    if(single == null)//2个线程
    
    synchronized(SingleDemo01.class){
    
    if(single == null){
    
    single = new SingleDemo01();
    
    }
    
    }
    return single;
    }
    }

    装饰者模式

    当你需要对某一个类的某一个功能进行增强的时候,就要用到装饰者模式;

    下面就举一些例子来完成对装饰者模式的认知:

    我现在想对list集合中的add方法进行增强,在添加元素时打印一句“开始添加元素”,添加完成后再打印一句“元素添加完成”;

    我们看到以上需求,我们本次采用装饰者模式去实现,去实现之前呢需要注意两点:

    1.将要装饰的或包装的类,作为增强类的属性

    2.需要实现增强功能

    具体实现过程:

    首先,我们先定义一个类,叫MyList;

    我现在要加强List的add方法,那么首先我就需要让list作为我的成员属性;

    定义好一个list泛型类型的属性后,我们需要对它进行赋值,所以我们就再给它提供一个构造函数;

    之后呢,我们在类中写一个带参的add方法,那我现在这个add方法是不是就是要对原始的add方法进行增强了;

    编码:

    public class MyList{
    
    private List<String>list;
    
    public MyList(List<String>list){
    
    super();
    
    this.list = list;
    
    }
    
    public void add (String e){
    
    //添加之前输出一句
    
    System.out.println("start。。。。。。。。。。");
    
    //添加
    
    list.add(e);
    
    //添加之后再输出一句
    
    System.out.println("end。。。。。。。。。。");
    
    }

    这个就是装饰者模式,某类中的某一个方法进行增强

    //写一个main方法进行测试
    
    public static void main (String[] args){
    
    //先建立一个list集合
    
    List<String>list = new List<String>();
    
    //list集合建完之后,我是不是就再建一个Mylist直接把值穿进去是不是就可以了
    
    MyList my = newMyList(list);
    
    my.add("ss");
    
    }
    
    }

    打印输出结果:

     我们看到执行结果,是不是已经按照要求增强了;

    这个时候我们还可以继续改进;

    改造成只能添加含有start的元素;

    我们仅需加一个if判断即可:

    public class MyList{
    
    private List<String>list;
    
    public MyList(List<String>list){
    
    super();
    
    this.list = list;
    
    }
    
    public void add (String e){
    
    //添加之前输出一句
    
    System.out.println("start。。。。。。。。。。");
    
    //添加
    
    if(e.contains("start")){//这里我们加了一个判断,表示判断添加进来的元素是否包含start,如果不包含就不进入该方法,也就意味着元素没添加进去
    
    list.add(e);
    
    }
    
    //添加
    
    list.add(e);
    
    //添加之后再输出一句
    
    System.out.println("end。。。。。。。。。。");
    
    }
  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/StanleyBlogs/p/10806876.html
Copyright © 2011-2022 走看看