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

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

做者 : Stanley 罗昊html

转载请注明出处和署名,谢谢!设计模式

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

什么是设计模式

设计模式其实就是是写了不少代码的人总结出来的经验!函数

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

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

就比方说医生问诊:编码

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

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

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

}
相关文章
相关标签/搜索