[TOC]
一个类只负责一项职责(并不是一个类只有一个方法)
客户端不依赖不需要的接口
改进后:
依赖关系传递的三种方式:接口传递、构造方法传递、setter方式传递
继承时,子类中尽量不要重写父类的方法
对扩展开放,对修改关闭
迪米特法则又叫最少知道原则,一个对象应该对其他对象保持最少的了解。
这里面的输出员工信息,放在自己的类里面对外提供public方法,不在另一个类重复这段代码,只需要调用该方法,即符合迪米特法则。
尽量使用合成/聚合的方式,而不是使用继承
聚合:
合成:
设计原则核心:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
amazing...
//构造器私有化
//静态常量本类对象
//对外提供getInstance方法
public class Singleton {
private Singleton() {
}
private static final Singleton instance = new Singgleton();
public static Singleton getInstance() {
return instance;
}
}
advantage:
disadvantage:
public class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
advantage:
disadvantage:
public class Singleton {
private Singleton() {
}
private static Singleton instance;
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
advantage:
disadvantage:
public class Singleton {
private Singleton() {
}
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
advantage:
public class Singleton {
private Singleton() {
}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleleton();
}
public static Singleton getInstance
{
return SingletonInstace.INSTANCE;
}
}
enum Singleton {
INSTANCE;
}
克隆羊:传统模式
优点
缺点
优点
缺点
传统模式
传统方式新增 pizza 种类时,调用者的代码需要做大量的修改,违反了 OCP 原则。
简单工厂模式
工厂创建具体的 pizza ,调用者找 工厂就ok了。
//日历对象的创建,就使用到了简单工厂模式
Calendar.getInstance();
对象的实例化推迟到子类
【也称为生成器模式】
盖房子:传统方式
优点
缺点
解决方案
把产品和产品建造过程解耦 ==> 建造者模式
盖房子:建造者
//StringBuilder 就用到了建造者模式
StringBuilder
注意事项:
基本介绍:Adapter 类通过继承 src 类,实现 dst 接口,完成 src-->dst 的适配
注意事项:
对象适配器和类适配器模式相同,只是 Adapter 不再继承 src 类,而是持有 src 类。
根据合成复用原则,尽量用关联关系代替继承。
接口中定义一堆方法,使用一个抽象类实现接口,并为该接口中的每一个方法提供一个默认的实现(空方法),那么该抽象类的子类可以有选择地覆盖父类的某些方法。
桥接模式:结构型,基于类的最小设计原则。将抽象和实现分开,两个层次可以独立改变。
桥接模式解决手机问题:
桥为抽象类 Phone。
符合 OCP 原则。
动态的将新功能附加到对象上,功能扩展更灵活。
注意事项
HashMap 中使用到了组合模式,component 为 AbstractMap。
外观模式也叫 “过程模式” ,提供一个高层接口,调用端只需要跟这个接口发生调用。
注意事项
MyBatis 中的 Configuration 创建 MetaObject 使用了外观模式。
享元模式:运用共享技术有效地支持大力度的对象。
能解决重复创建对象的内存浪费问题。Eg,String常量池、数据库连接池。
Integer类中就使用到了享元模式, -128 ~ 127 共享缓存池中的对象,范围外的就不在缓存池了,而是创建新的对象。所以 Integer.valueOf(127) == Integer.valueOf(127) 为 true。
好处:对目标对象的方法增强,即扩展目标对象的功能。
目标对象可以是:远程对象,创建开销大的对象,需要安全控制的对象。
三种代理形式:静态代理,JDK 动态代理,cglib 代理。
1.定义一个接口及其实现类;
2.创建一个代理类同样实现这个接口
3.将目标对象注入进代理类,然后在代理类的对应方法中调用目标类中的对应方法。
被代理的目标对象必须实现接口。
1.定义一个接口及其实现类;
2.定义一个工厂类,实现 InvocationHandler 接口并重写invoke方法,在 invoke 方法中调用目标对象的方法(被代理类的方法)并自定义一些处理逻辑
3.通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法创建代理对象
被代理的目标对象是普通类,不需要实现接口
1.定义一个被代理普通类;
2.定义一个工厂类,实现 MethodInterceptor 接口并重写 intercept 方法,intercept 用于拦截增强被代理类的方法,和 JDK 动态代理中的 invoke 方法类似;
3.通过 Enhancer 类的 create()创建代理类
制作豆浆
注意事项和细节:
基本思想:算法只存在一个地方(父类中),易修改。
实现了最大代码复用。
模板方法都要加上final关键字,防止子类修改模板方法。
适用场景:当要完成某个过程,该过程要执行一系列步骤,这一系列步骤基本相同,个别步骤在实现时可能不同。
缺点:每一个不同的实现都需要一个子类实现,导致类的个数增加,使系统更加庞大。
命令模式,将发起请求、执行请求的对象解耦。
缺点:可能导致某些系统有过多的具体命名类,增加系统的复杂度。
访问者模式
访问者模式解决测评系统:
符合单一职责原则,扩展性、灵活性更好。
缺点:违反了依赖倒转原则。访问者依赖的是具体的元素,而不是抽象元素。对访问者公布细节。
优点:
1.提供了一个统一的方法遍历对象,用户不用考虑聚合类型,使用一种方法就可以遍历对象;
2.符合单一职责原则,一个类只有一个引起变化的原因。
3.隐藏聚合的内部结构,客户端要遍历集合的时候只能取到迭代器,而不会知道聚合的具体构成。
缺点:
每个聚合对象都要一个迭代器,会产生多个迭代器不好管理类。
需求:天气预报
观察者模式解决天气预报
中介者模式,用一个中介对象来封装一系列的对象交互。
中介者模式解决智能家庭管理
四则运算问题
APP抽奖活动
带来的问题
策略模式,定义算法族,封装起来可以相互替换。
鸭子问题具体的策略:
注意事项和细节:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。