【学习笔记】设计模式原则与UML类图

248 阅读4分钟

1 设计模式原则

1.1 单一职责原则

  一个类只负责一项职责。有时当类的方法较少,可以在方法级别上体现单一职责原则。

1.2 接口隔离原则

  一个类对另外一个类的依赖应该是建立在"最小"的接口上。

  比如接口Interface有5个方法,B类和D类实现该接口。A类通过接口依赖B,但只会使用1,2,3这三个方法;C类通过接口依赖D,但只会使用1,4,5这三个方法。

  这时根据原则应该把接口Interface拆成三个子接口InterfaceA,InterfaceB和InterfaceC。

  • InterfaceA只有1方法

  • InterfaceB只有2和3方法

  • InterfaceC只有4和5方法

    然后B类实现InterfaceA和InterfaceB,D类实现InterfaceA和InterfaceC。

1.3 依赖倒转原则

  • 高层模块不应该依赖底层模块,两者应该依赖抽象
  • 细节依赖抽象
  • 该原则的中心思想是面向接口编程

1.3.1 例子

public interface Message {
    void getInfo();
}
public class Email implements Message {
    @Override
    public void getInfo() {
        System.out.println("收到邮件了");
    }
}
public class People {
    // receive方法的参数不应该是具体的Email类。
    // 将来可能扩充QQ类,微信类等,这些类只要实现了Message接口,那么该方法也适用
    public void receive(Message m) {
        m.getInfo();
    }
    public static void main(String[] args) {
        People p = new People();
        p.receive(new Email());
    }
}

1.3.2 实现的方式

  • 通过传递接口实现依赖,如上述例子

  • 通过构造方法传递依赖

    interface IOpenAndClose {
        void open();
    }
    interface ITV {
        void play();
    }
    class OpenAndClose implements IOpenAndClose{
        private ITV tv;
        public OpenAndClose(ITV tv) {
            this.tv = tv;
        }
        @Override
        public open() {
            this.tv.play();
        }
    }
    
  • 通过set方法传递依赖

1.4 里氏替换原则

  • 引用父类的地方必须能透明地使用其子类的对象,子类不能在父类会的东西上进行"创新"

  • 子类尽量不要重写父类的方法

  • 进行设计的时候,尽量从抽象类继承,而不是从具体类继承

1.5 开闭原则(OCP)

  • 模块和函数对扩展开发(提供发),对修改关闭(使用方)
  • 用抽象构建框架,用实现扩展细节
  • 当软件需要变化时,尽量通过扩展来实现变化,而非修改已有代码来实现变化
  • 遵循其他原则的目的就是为了实现开闭原则

1.6 迪米特法则

  • 一个类应该对自己需要耦合或调用的类知道的最少,所以又称最少知道原则

  • 只与朋友类交流,尽量不与陌生类交流

    出现在成员变量、方法的参数、方法返回值中的类称为朋友类,如果方法返回值是集合,集合中的泛型类也算朋友类。而出现在方法里的局部变量不属于朋友类。

  • 类间public方法不能肆无忌惮的暴露

  • 该法则的核心是降低类间的耦合关系

1.7 合成/聚合复用原则

   在软件复用时,要尽量先使用组合或者聚合关系来实现,其次才考虑使用继承关系来实现。

2 UML类图

  • 矩形框的第一行为类名,斜体字则为抽象类;第二行为属性;第三行为方法。'+'表示public;'-'表示private;'#'表示protected

  • 顶端写着《interface》或者矩形框上有"棒棒糖",则表示接口

  • 常见关系如下所示

    关系画图解释画图方向
    继承实线+空心三角形子类指向父类
    实现虚线+空心三角形实现类指向接口
    依赖虚线+箭头使用关系;代码体现在局部变量、方法参数、静态方法的调用指向被使用者
    关联实线+箭头拥有关系;A类拥有B类属性,则A类关联B类;代码体现在成员变量A类关联B类,则A指向B
    聚合空心菱形+实线+箭头弱"拥有"关系;整体与部分的关系,且部分离开整体可以单独存在。比如车子和轮胎,轮胎离开车子依然可以存在空心菱形在整体那边,箭头在部分那边
    合成/组合实心菱形+实线+箭头强"拥有"关系;整体与部分的关系,但部分不能离开整体单独存在,部分与整体的生命周期相同。比如鸟和翅膀实心菱形在整体那边,箭头在部分那边
  • 耦合度:依赖 < 关联 < 聚合 < 合成/组合

例图如下所示(出自《大话设计模式》) 014-01.png

3 相关链接