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。。。。。。。。。。"); }