# designPattern **Repository Path**: longhaicheng/design-pattern ## Basic Information - **Project Name**: designPattern - **Description**: 《大话设计模式》 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-08 - **Last Updated**: 2023-02-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Design Patterns --- ## 使用设计模式的原则 1. 找出应用中可能变化之处,把他们独立出来‘ 2. 针对接口编程,而不是针对实现 3. 多用组合,少用继承 ## 设计原则 ### 单一职责原则 ### 接口隔离原则 > 一个类对另一个类的依赖应该建立在最小的接口上 将拥有多个功能的大接口拆分为多个小接口,类通过实现多个小接口完成功能 ### 依赖倒置原则 1. 高层模块不应该依赖底层模块,二者都应该依赖抽象 2. 抽象不应该依赖细节,细节应该依赖抽象 #### 依赖关系传递的三种方式 1. 接口传递 ```java // 定义第一个接口 public interface Itv { void play(); } // 定义第二个接口 public interface IOpenAndClose { void open(Itv itv); } // 在实现类中调用接口的方法 public class OpenAndClose implements IOpenAndClose { @Override public void open(Itv itv) { itv.play(); } } ``` 2. 构造方法传递 ```java // 定义公共接口 public interface Itv { void play(); } // 第一个实现类 @Slf4j public class AppleITv implements Itv{ @Override public void play() { log.info("Apple TV"); } } // 定义接口 public interface IOpenAndClose { void open(); } // 通过构造函数传入具体的实现类 public class OpenAndClose implements IOpenAndClose { private final Itv itv; public OpenAndClose(Itv itv) { this.itv = itv; } @Override public void open() { itv.play(); } } ``` 3. _setter()_传递 ```java // 定义接口 public interface IOpenAndClose { void open(); void setITv(Itv itv); } // 实现接口,并 setter 具体的实现类,最终完成调用 public class OpenAndClose implements IOpenAndClose { private Itv itv; @Override public void open() { itv.play(); } @Override public void setITv(Itv itv) { this.itv = itv; } public static void main(String[] args) { OpenAndClose openAndClose = new OpenAndClose(); openAndClose.setITv(new AppleITv()); openAndClose.open(); } } ``` ### 里氏代换原则 ### 开闭原则 > 对扩展开放,对修改关闭 ### 迪米特法则 > 一个类对自己依赖的类知道的越少越好 1. 核心是降低类之间的耦合 ### 合成复用原则 > 尽量使用合成\聚合的方式,而不是继承 ### 总结 1. 找出应用中可能需要变化之处,把它们独立出来,不与其无关代码混合 2. 针对接口编程,而不是针对实现编程 3. 为了交互对象之间的松耦合设计而努力 ### [简单工厂模式](src/main/java/website/lhc/chapter1/CashFactory.java) ### [策略模式](src/main/java/website/lhc/chapter2/Context.java) * 意图:定义一系列算法,把他们封装起来,并且使他们可相互替换 * 主要解决:当 * 何时使用:在不想增加很多子类的情况下拓展类 ### [简单工厂模式+策略模式](src/main/java/website/lhc/chapter1/CashContext.java) ### 装饰器模式 * 意图:动态的给对象添加一些额外属性, * 主要解决:当子类过多导致出现膨胀现象 * 何时使用:在不想增加很多子类的情况下拓展类 #### 实现 * [装饰器模式1](src/main/java/website/lhc/chapter3/ClubbedTroll.java) * [装饰器模式2](src/main/java/website/lhc/chapter4/ConcreteDecoratorA.java) * [装饰器模式3](src/main/java/website/lhc/decorator/DecoratorTest.java) ### [代理模式](src/main/java/website/lhc/chapter5/ProxyPatternTest.java) * 意图:为其他对象提供一种代理以控制这个对象的访问 * 主要解决:在直接访问对象时带来的问题,直接访问会给使用者或者系统带来很多麻烦,可以在访问此对象时加上一个代理层 * 何时使用:想在访问一个类时做一个控制 ### [状态模式](src/main/java/website/lhc/chapter6/StateTest.java) [Java Design Patterns - Example Tutorial](https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial)