作者 : 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 classSingleDemo01{
- //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..........");
- }
来源: https://www.cnblogs.com/StanleyBlogs/p/10806876.html