使程序拥有更好的的
设计模式的原则:设计“设计模式”时,遵守的原则,这样设计的依据
即一个类只负责一个职责,如有多个职责应分为多个类
一个类对另一个类的依赖应当建立在最小接口上
如存在一个接口Interface1存在4个方法a()、b()、c()、d(),它有一个实现类Impl1实现了它的四个方法。现存在类Class1需要使用接口中的b()和c()方法,即Class1依赖与Interface1,使用uml类图表示如图

对于实现类Impl1来说,a()和d()方法没有被使用,可以无需实现,却必须要书写。此时出现代码的冗余。根据接口隔离原则,可以将Interface1接口进行拆分

此时如果有另一个类需要使用b()、c()、d()三个方法时,需要将上图中的Interface2再拆分一次

至此,ClassA对ImplA的依赖,ClassB对ImplB的依赖,建立在最小接口上
例1:打印出来源的信息
不遵守依赖倒转原则的写法
public class RawDependenceReversal {
    public static void main(String[] args) {
        Person p = new Person();
        p.receive(new Email());
    }
}
class Email{
    public String getInfo(){
        return "电子邮件信息";
    }
}
class Person{
    public void receive(Email e){
        System.out.println(e.getInfo());
    }
}
此时,若Person类可以接收的来源不只是Email,还需要添加其他来源时,会比较麻烦。
遵守依赖倒转原则进行改进:
public class ImproveDependenceReversal {
    public static void main(String[] args) {
        Persons p = new Persons();
        p.receive(new Emails());
        p.receive(new WeChat());
    }
}
interface Sender{
    public String getInfo();
}
class Emails implements Sender{
    @Override
    public String getInfo(){
        return "电子邮件信息";
    }
}
class WeChat implements Sender{
    @Override
    public String getInfo() {
        return "微信信息";
    }
}
class Persons{
    public void receive(Sender e){
        System.out.println(e.getInfo());
    }
}
依赖倒转的使用方式示例\
方式1:使用接口方式来进行依赖(调用方法时使用接口作为参数)。此时,依赖的是接口而不是细节类,因此符合依赖倒转原则
interface IOpenAndClose{
    void open(ITV tv);
}
class OpenAndClose implements IOpenAndClose{
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}
interface ITV{
    void play();
}
方式2:通过构造方法来进行依赖
interface IOpenAndClose{
    void open();
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    public ITV tv;
    public OpenAndClose(ITV tv){
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}
方式3:通过setter方法来进行依赖
interface IOpenAndClose{
    void open();
    public void setTv(ITV tv);
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    private ITV tv;
    @Override
    public void open() {
        this.tv.play();
    }
    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }
}
注意事项和细节
public方法。23种分为三大类
创建型模式
单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式
模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式
原文:https://www.cnblogs.com/Weihaom/p/14234985.html