Android开发经验谈Android开发

Android设计模式七大原则,原来还可以这么玩?

2020-05-09  本文已影响0人  愿天堂没Android

设计模式七大原则

1、设计模式的目的

道亦有道,术亦有术,在成长这件事上,吃经验无疑是速度最快的一种。而设计模式则是无数前辈们爬过的坑留下的经验总结,所以当值得细细精品。

在编写软件的过程中,无时不面临着来自耦合性、内聚性以及可维护性,可扩展性,重用性,灵活性等各方面的挑战。而设计模式的存在,则是为了让程序具有更好的:

  1. 代码重用性(即:相同功能的代码,不用多次编写)
  2. 可读性(即:编程规范性)
  3. 可扩展性(即:当需要增加新的功能时,非常方便)
  4. 可靠性(即:增加新的功能后,对原来的功能没有 影响)
  5. 使程序呈现高内聚、低耦合的特性

2、设计模式七大原则

设计模式原则也就是在编写程序时,应当遵守的原则,也就是各种设计模式的基础,即设计模式为什么这样设计的依据。

  1. 单一职责原则
  2. 接口隔离原则
  3. 依赖倒转原则
  4. 里式替换原则
  5. 开闭原则
  6. 迪米特法则
  7. 合成复用原则

3、七大原则

3.1 单一职责原则
1、基本介绍

对类来说,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2

2、应用实例

以交通工具为例:

方式一:

只有run方法,违反了单一职责原则,对于不同的交通工具无法解决

class Vehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "在公路上跑");
    }
}

方式二:

按照不同的交通工具拆解成不同的类,即将类分解,但是改动比较大

class VehicleRoad {
    public void run(String vehicleRoad) {
        System.out.println(vehicleRoad + "在陆地上跑");
    }
}

class VehicleAir {
    public void run(String vehicleA) {
        System.out.println(vehicleA + "在天上飞");
    }
}

class VehicleWater {
    public void run(String vehicleWater) {
        System.out.println(vehicleWater + "在水里游");
    }
}

方式三:

增加方法,虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上仍然遵守单一职责

class Vehicle2 {
    public void runRoad(String vehicle) {
        System.out.println(vehicle + "在公路上跑");
    }

    public void runAir(String vehicle) {
        System.out.println(vehicle + "在天上飞");
    }

    public void runWater(String vehicle) {
        System.out.println(vehicle + "在水里游");
    }
}

3、单一职责原则细节
3.2 接口隔离原则
1、基本介绍

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

2、实际案例

先看类图:

类A通过接口interface1依赖类B,类C通过接口interface1依赖类D,如果接口interface1对于类A和类C来说不是最小接口,则类B和D必须实现它们不需要的方法。

按照接口隔离原则,将接口interface1拆分成独立的几个接口,类A和C分别与他们需要的接口建立依赖关系如下所示:

3.3 依赖倒转原则
1、基本介绍

依赖倒转原则(Dependence Inversion Principle)指:

2、应用实例

完成Person接收信息的功能

方式一:

简单,比较容易想到

如果获取的是微信、短信等,则新增类,同时Person也要增加相应的接收方法

class Email{
    public String getInfo(){
        System.out.println("电子邮件");
    }
}
class Person{
    public void receive(Email email){
        System.out.println(email.getInfo());
    }
}

方式二:

引入一个抽象接口IReceiver,表示接收者,这样Person类与接口IReceiver发生依赖,扩展方便

interface IReceiver{
    public String getInfo();
}

class Email implements IReceiver{
    public String getInfo(){
        return "电子邮件";
    }
}
class Person{
    public void receive(IReceiver receiver){
        System.out.println(receiver.getInfo());
    }
}

3、依赖关系传递的三种方式

接口传递

interface IOpenAndClose{
    public void open(ITV itv);
}

interface ITV{
    public void play();
}

class CHnagHong implements ITV{

    @Override
    public void play() {
        System.out.println("长虹电视机,打开");
    }
}

class OpenAndClose implements IOpenAndClose{
    @Override
    public void open(ITV itv) {
        itv.play();
    }
}

构造方法传递

interface IOpenAndClose{
    public void open();
}

interface ITV{
    public void play();
}

class OpenAndClose implements IOpenAndClose{
    public ITV itv;
    public OpenAndClose(ITV itv){
        this.itv=itv;
    }

    @Override
    public void open() {
        itv.play();
    }
}

通过setter方法传递

interface IOpenAndClose{
    public void open();

    public void setTv(ITV itv);
}

interface ITV{
    public void play();
}

class OpenAndClose implements IOpenAndClose{
    private ITV itv;

    @Override
    public void setTv(ITV itv) {
        this.itv=itv;
    }

    @Override
    public void open() {
        itv.play();
    }

}

4、注意细节
3.4 里式替换原则
1、继承带来的问题
2、基本介绍
3.5 开闭原则
1、基本介绍
3.6 迪米特法则
1、基本介绍
3.7 合成复用原则
1、基本介绍

尽量使用合成/聚合的方式,而不是使用继承

4、设计原则核心思想

5、设计模式类型

设计模式大体上分为三种类型,共23种

创建型模式单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

行为型模式:模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)

上一篇下一篇

猜你喜欢

热点阅读