public interface A {
void method();
}
public class AImpl implements A {
public void method() {
}
public void methodSub() {
}
}
// 使用方
public class Test {
public static void main(String[] args) {
AImpl obj = new AImpl();
// 外部调用时obj对象的类不能替换成A,则违反了LSP
obj.methodSub();
}
}
3. 依赖倒置原则
依赖倒置原则(
Dependence Inversion Principle,DIP
)
High level modules should not depend upon low level modules.Both should depend upon
abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
模块间的依赖通过抽象发生(接口或抽象类) 接口或抽象类不依赖于实现类 实现类依赖接口或抽象类 简而言之就是解耦 4. 接口隔离原则
Interface Segregation Principle
Clients should not be forced to depend upon interfaces that they don't use. (客户端不应该依 赖它不需要的接口。) The dependency of one class to another one should depend on the smallest possible interface. (类间的依赖关系应该建立在最小的接口上。) 简而言之,用什么依赖什么 所以对接口就要求
接口职能单一,服务定制,设计有度 接口要高内聚,减少交互 5. 迪米特法则 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP) 只通过接口协定交互,其他一概不管;only talk to your immediate friends(只与直接的朋友沟通。) 是自己的逻辑就是自己的逻辑,不是自己的就不是自己的 6. 开闭原则 Open Closed Principle Software entities like classes,modules and functions should be open for extension but closed for modifications. (一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。) 开闭原则个人粗浅的见解是一个法典,像一种理想化,一种指导方针;我们需要通过抽象约束、规范制度、需求预见等使程序在时间推移的过程中一直在做扩展和增强,减少已有的抽象的修改(例如接口制定了,以后都不用再修改,这个肯定是我们最希望的);我们需要朝这个方向去努力,拥抱变化的同时,越少打破这个原则
28大设计模式 1. 单例模式
最简单常用的模式,不展开了
public Sun {
private static final Sun sun = new Sun();
public static Sun getInstance() {
return sun;
}
public void light() {
System.out.println("太阳发光");
}
}
2. 工厂方法模式
Define an interface for creating an object,but let subclasses decide which class to
instantiate.Factory Method lets a class defer instantiation to subclasses.
(定义一个用于创建对象的
接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
优点:
1.
良好的封装性,代码结构清晰
2. 良好的扩展性(横向扩展,例如例子中需要新增一种食物)
3. 解耦,散落到各处的类似的初始化逻辑可以被封装,不用重复写,也提高维护性
应用:
1. 可简化成 简单工厂模式 用静态方法代替工厂类
2. 升级成多工厂
3. 单例模式的替代品
4. 延迟初始化
public interface Food {
void name();
}
public class Bread implements Food {
@Override
public void name() {
System.out.println("我是面包");
}
}
public class cookie implements Food {
@Override
public void name() {
System.out.println("我是饼干");
}
}
public class FoodFactory {
public T productFood(Class cls) {
T t = null;
try {
t = cls.newInstance();
} catch (Exception e) {
System.out.println("我不会生产这个");
e.printStackTrace();
}
return t;
}
public static void main(String[] args) {
FoodFactory factory = new FoodFactory();
Bread bread = factory.productFood(Bread.class);
bread.name();
cookie cookie = factory.productFood(cookie.class);
cookie.name();
}
}
3. 抽象工厂模式
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们 的具体类。)
优点: 1. 抽象封装 2. 分类约束 缺陷: 1. 子工厂扩展受限public interface Food {
void name();
}
public class SweetBread implements Food {
@Override
public void name() {
System.out.println("我是甜面包");
}
}
public class SaltyBread implements Food {
@Override
public void name() {
System.out.println("我是咸面包");
}
}
public class cookie implements Food {
@Override
public void name() {
System.out.println("我是饼干");
}
}
public abstract class FoodFactory {
T productFood(Class cls);
}
public class BreadFactory extends FoodFactory {
public T productFood(Class cls) {
T t = null;
try {
t = cls.newInstance();
} catch (Exception e) {
System.out.println("我不会生产这个");
e.printStackTrace();
}
return t;
}
public static void main(String[] args) {
FoodFactory factory = new BreadFactory();
SweetBread bread1 = factory.productFood(SweetBread.class);
bread1.name();
SaltyBread bread2 = factory.productFood(SaltyBread.class);
cookie2.name();
}
}
4. 模板方法模式
对于业务模型的业务动作模板化;基本方法在子类中实现,模板方法在父类中调度
优点: 1. 封装固定部分,扩展可变部分 2. 公共代码提取,统一行为控制 缺陷: 1. 行为流程固化(之前是抽象的是一个动作;现在是抽象了动作和动作的顺序) 2. 复杂场景新手阅读不适(串联逻辑时,一下到子类,一下到父类,绕晕)public abstract class Car {
public abstract void start();
public abstract void drive();
public abstract void stop();
public void run() {
start();
drive();
stop();
}
}
public class HongQiCar extends Car {
@Override
public void start() {
System.out.println("红旗车启动");
}
@Override
public void drive() {
System.out.println("红旗车行驶");
}
@Override
public void stop() {
System.out.println("红旗车停止");
}
public static void main(String[] args) {
Car car = new HongQiCar();
car.run();
}
}
5. 建造者模式
今天先到这吧,后面再补
-- 有缘登山,寒山不寒



