【设计模式】软件设计原则——依赖倒置&合成复用

依赖倒置引出


依赖倒置

**定义:**高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。面向接口编程而不是面向实现编程。

通过抽象使用抽象类、接口让各个类or模块之间独立不影响,实现模块之间的松耦合,降低模块之间的耦合性。

**注意:**每个类都尽量实现接口or继承抽象类;尽量避免从具体的类派生;尽量不要覆盖基类方法。

**优点:**减少类之间耦合性;提高系统稳定性、可维护性、代码可读性。


依赖倒置案例

java 复制代码
public class Customer {
    public void buyTV() {
        System.out.println("买电视机");
    }

    public void buyPhone() {
        System.out.println("买手机");
    }
}
//试问?如果需要买其他商品呢,就要在这个具体Customer类中去加方法,可维护性低。

依赖倒置------接口注入

java 复制代码
//顾客类
public class Customer {
    public void buy(IGood iGood) {
        iGood.buy();
    }
}

//商品的接口
public interface IGood{
    void  buy();//抽象的buy方法
}

//电视机商品
public class TVGood implements IGood {
    @Override
    public void buy() {
        System.out.println("买电视机");
    }
}
//手机商品
public class PhoneGood implements IGood {
    @Override
    public void buy() {
        System.out.println("买手机");
    }
}

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.buy(new TVGood());
    }
}

依赖倒置------构造器注入

java 复制代码
public class Customer {
    private IGood iGood;

    public Customer(IGood iGood) {
        this.iGood = iGood;
    }

    public void buy() {
        this.iGood.buy();
    }
}

public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer(new TVGood());
        customer.buy();
    }
}

依赖倒置------Setter注入(推荐)

java 复制代码
public class Customer {
    private IGood iGood;

    public void setiGood(IGood iGood) {
        this.iGood = iGood;
    }

    public void buy() {
        this.iGood.buy();
    }
}

合成复用原则引出


合成复用原则

**定义:**想要达到软件复用的目的,尽量使用对象组合/聚合,而不是继承关系;

组合: A类中包含了B类的引用,当A类对象销毁时,B类引用所指向的对象也一同消失,没有任何一个引用指向他,该引用成为了垃圾对象,被回收;
聚合: 加入A类销毁后,B类对象还有在其它位置被引用,B类对象不会被销毁,

电脑与鼠标是聚合关系,电脑毁了,鼠标可以独立存在,还可以接在其它电脑上;
合成复用优点: 系统更加灵活,降低类之间耦合度,一个类的变化对其他类造成的影响相对较少;
**合成复用缺点:**通过组合/聚合方式建造的系统,有较多的对象需要管理;

继承复用优点: 易扩展;
**继承复用缺点:**白箱复用,继承将父类的实现细节暴露给了子类;


继承复用案例

java 复制代码
/**
 * 数据连接
 */
public class DBConnection {
    public String getConnection() {
        return "数据连接";
    }
}


public class ProDao extends DBConnection {
    /**
     * 增加产品
     */
    public void addProduct() {
        // 父类super获取连接
        String conn = super.getConnection();
        System.out.println("使用 " + conn + " 增加产品");
    }
}

public class Main {
    public static void main(String[] args) {
        ProductDao proDao = new ProDao();
        productDao.addProduct();
    }
}

合成复用案例

java 复制代码
/**
 * 抽象类
 */
public abstract class DBConnection {
    public abstract String getConnection();
}


/**
 * MySQL连接
 */
public class MySqlConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "MySQL数据库连接";
    }
}
/**
 * Oracle连接
 */
public class OracleConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Oracle数据库连接";
    }
}

//----------------------------------------------------------------------

/**
 * 增加数据
 */
public class ProDao {
    /**
     * 组合方式注入数据库连接
     */
    private DBConnection connection;

    public ProductDao(DBConnection connection) {
        this.connection = connection;
    }

    /**
     * 新增
     */
    public void addProduct() {
        // 获取连接
        String conn = connection.getConnection();
        System.out.println("使用 " + conn + " 增加产品");
    }
}

public class Main {
    public static void main(String[] args) {
        ProductDao proDao = new ProDao(new MysqlConnection());
        productDao.addProduct();
    }
}
相关推荐
小白不太白95015 分钟前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus2 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大2 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
机器视觉知识推荐、就业指导4 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
阳光开朗_大男孩儿4 小时前
组合模式和适配器模式的区别
设计模式·组合模式·适配器模式
MinBadGuy4 小时前
【GeekBand】C++设计模式笔记13_Flyweight_享元模式
c++·设计模式
Clang's Blog6 小时前
23种设计模式详解(以Java为例)
java·开发语言·设计模式
程序员奇奥6 小时前
设计模式——简单工厂模型、工厂模式、抽象工厂模式、单例模式、代理模式、模板模式
单例模式·设计模式·抽象工厂模式
hxj..6 小时前
【设计模式】代理模式
java·设计模式·代理模式·动态代理
十五年专注C++开发7 小时前
C++不完整类型(Incomplete Type)的检测与避免
开发语言·c++·算法·设计模式