大话设计模式

6大原则

单一职责原则

一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。核心就是控制类的粒度大小、将对象解耦、提高其内聚性

开放封闭原则

软件实体(类、模块、函数等)可以应该可以扩展,但不可以修改

依赖倒转原则

PC中的易插拔 —— 对象中的 强内聚、松耦合

  • 高层模块不应该依赖于低层模块,两个都应该依赖于抽象
  • 抽象不应该依赖于细节,细节应该依赖于抽象。(针对接口编程,不要对实现编程)

里氏代换原则

子类型必须能替换掉它们父类型。(子类拥有父类所有非private的行为和属性)

迪米特法则

如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。

  • 思想:强调了类之间的松耦合。 类之间的耦合越弱,越有利于复用。

设计模式

创建型模式

作用于对象的创建,将对象的创建与使用分离

img

单列模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点

原型模式

在原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示。

它主要用于创建一些复杂的对象,这些对象内部结构间的建造顺序通常是稳定的,但内部的结构通常面临着复杂的变化。(创建对象的模板)

img

简单工厂模式

工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖

缺点:违背了开放-封闭原则, 增加新功能的是的时候需要在工厂类的switch中修改逻辑。

img

class OperationFactory {
    public static Operation createOperation(char operation){
        Operation oper = null;
        switch (operation) {
            case '+': {
                oper = new OperationAdd();
            }
            case '-': {
                oper = new OperationSub();
            }
            case '*': {
                oper = new OperationMul();
            }
            case '/': {
                oper = new OperationDiv();
            }
        }
        return oper;
    }
}

工厂方法模式

工厂方法模式:定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类

遵循了开放-封闭原则

img

// 工厂类
interface IFactory{
    IOperation createOperation();
}
// 工厂实现类
class AddOperationFactory implements IFactory{

    public IOperation createOperation() {
        return new AddOperation();
    }
}

class SubOperationFactory implements IFactory{

    public IOperation createOperation() {
        return new SubOperation();
    }
}

抽象工程模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

img

优点:

  • 易于交换产品系类,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.

  • 让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中

缺点:

新增功能的时候,需要改动所有的工厂和工厂实现类。如需要增加一个ProductC,所有的工厂 类都需要增加crateProductC相关方法。

优化扩展: (抛弃 *Factory 工厂类)

  1. 用简单工厂来改进抽象工厂

    class ProductAccess{
        private String type;
        public  ProductAccess(String type){
            this.type = type;
        }
        
        public static AbstractProductA crateProductA(){
            AbstractProductA productA = null;
            switch(type){
                 case:"1" 
                   productA = new ProductA1();
                    break;
                  case:"2"
                    productA = new ProductA2();
                    break;         
            }
            return productA;
        }
       
         public static AbstractProductA crateProductB(){
             ......
         }
    }
    
  2. 反射 + 抽象工厂

    额我说的我

结构型模式

将类或对象按某种布局组成更大的结构

代理模式

为其他对象提供一种代理以控制对这个对象的访问。

img

适配器模式

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容不能一起工作的那些类可以一起工作。

  • 场景: 系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况

    两个类所做的事情相同或相似,但是具有不同的接口时要使用他,客户代码可以统一调用同一接口

img

外观模式

为子系统中的一组接口提供 提供一个一致的界面,此模式定义了一个高层接口,这一接口使得子系统更加容易使用。

img

装饰模式

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

img

桥接模式

将抽象部分与他的是实现部分分离,使它们都可以独立的变化(GoF)。

通俗意思: 实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少他们之间的耦合。

  • 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数

img

享元模式

运用共享技术有效的支持大量细粒度的对象。

img

组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

img

  • When: 需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式了

行为型模式

作用于类或对象之间相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责

模板方法

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

img

策略模式

它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

  • 策略模式就是用来封装算法的,在实践中也可以用来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

img

命令模式

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

img

责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。

img

状态模式

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

img

  • 目的:消除庞大的条件分支语句,状态模式通过各种状态转移逻辑分布在Status之间,来减少相互的依赖。
  • 什么时候用:当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了。

观察者模式

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个歌主题对象在状态发生变化时,会通知所有的观察者对象,使它们能过自动更新自己。

img

  • 什么时候使用:
    • 当一个对象的改变需要改变其他对象,而且它不知道具体要有多少对象待改。
    • 当一个抽象模型有两个方面,其中一个依赖于另外一个方面,可以用观察者模式将两者封装在独立的对象中,使它们各自独立的改变和复用。
事件委托

委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值,委托可以看作时对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数

中介者模式

迭代器模式

访问者模式

备忘录模式

解析器模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值