设计模式的心得

本文深入解析设计模式,涵盖桥接、外观、策略等23种模式。探讨开闭、依赖倒置等六大基本原则,示例代码展示工厂、单例、观察者等模式实践,助您代码设计更高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
  • 以前学习js的时候了解过设计模式,觉得是很神奇的事情,就好比武侠小说中的各种招式,可以拿来对付代码中的各种问题
  • 最近又看教程和书籍重新温习了一遍,脑海中很清晰的有了关于设计模式的印象
  • 感觉现在写代码,无招胜有招,在不知不觉中就会把设计模式运用到代码当中
两个原则
  • 各个设计模式都是基于以下六大基本原则进行设置的
    • 开闭原则【最重要的原则】
      • 对容易变化的进行抽象
      • 对复杂的逻辑进行封装
      • 指对扩展开放,对修改封闭
      • 在实际应用中,我们通过接口来抽象,然后定义一个该接口类型的list集合或者字典,向字典添加或者删除即实现扩展,然后循环遍历调用集合中具体实现类的方法,即调用方法
    • 依赖倒置原则
    • 单一职责原则
    • 接口隔离原则
    • 迪米特法则(最少知识原则)
      • 各个类之间最好不要建立直接的联系,这样会导致存在很多中介类
      • 应用案例 门面模式 中介模式
    • 里氏替换原则
      • 这个以前介绍过, 父类变量可以引用子类实例,但是只能调用父类的方法,不能调用子类中的方法
      • 如果父类变量引用的是子类实例,可以强制转换成子类
设计模式
  • 模式都是基于前面6个原则的基础演化而来
  • 这里只介绍其核心
桥接模式 外观模式
  • 这两个个模式都是定义一个中介类来负责两个类之间的联系
策略模式 中介者模式 代理模式
  • 这三种模式意图不同,但是实现一样。都要定义一个接口
  • 继承同一个接口。
备忘录模式
  • 通过一个备忘录类专门存储对象状态。
  • 客户不与备忘录类耦合,与备忘录管理类耦合。
  • Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
  • 备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
模板方法模式
  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
  • 骨架和一些算法在抽象类实现,其他步骤在子类实现。
观察者模式
  • 通过事件驱动的操作
  • 比如成就系统, 我们可以对用户的某个行为添加观察者。当发生改变或者达到某个等级的时候就触发
  • 当对象间存在一对多关系时,则使用观察者模式。当对象被修改时,会逐一通知观察者们
  • 在抽象类里有一个 ArrayList 存放观察者们。观察者们继承自同样的接口,当状态改变时,遍历调用集合中的观察者,进行更新
状态模式
  • 两个基类,状态类与状态系统类,状态类里面包含了该状态要执行的行为与过渡条件以及过渡对象。
  • 状态系统类负责执行状态和各个状态之间的转换
  • 经常用于有限状态机中
  • http://wiki.unity3d.com/index.php/Finite_State_Machine
组合模式
  • 树枝和叶子实现统一接口,树枝内部组合该接口。该接口定义了每个节点的基本信息和它下面的子节点集合list,如果没有子节点,list.count则为0
  • 树枝内部组合该接口,并且含有内部属性 List,里面放 Component。
  • 类似于二叉树,可以通过深度优先或者广度优先进行遍历
适配器模式
  • 适配器继承或依赖已有的对象,实现想要的目标接口。
责任链模式
  • 责任链模式为请求创建了一个接收者对象的链
  • 接收者对象实现同一个接口并保存下一个接收者的引用,判断自己能否处理请求,不能处理就将请求向下传递
单例模式
  • 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。
工厂模式(简单工厂,工厂方法,抽象工厂)
  • 这三种工厂都是为了方便创造对象,而且复杂程度一步步升级
  • 简单工厂负责创造一类对象。比如 有一个车的接口,继承这个接口有很多种类的车,工厂通过用户输入的类型,判断创建什么车

public class Factory {
	public BMW createBMW(int type) {
		switch (type) {
		
		case 320:
			return new BMW320();
 
		case 523:
			return new BMW523();
 
		default:
			break;
		}
		return null;
	}
}

  • 但是这样违反了开闭原则,如果我们增加一种新的类型的车子。就需要修改代码
  • 工厂方法定义了一个工厂接口,为每一种汽车都创建一个工厂
interface FactoryBMW {
	BMW createBMW();
}
 
public class FactoryBMW320 implements FactoryBMW{
 
	@Override
	public BMW320 createBMW() {
 
		return new BMW320();
	}
 
}
public class FactoryBMW523 implements FactoryBMW {
	@Override
	public BMW523 createBMW() {
 
		return new BMW523();
	}
}

  • 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象
//创建工厂的接口  
public interface AbstractFactory {  
    //制造发动机
    public Engine createEngine();
    //制造空调 
    public Aircondition createAircondition(); 
}  
 
 
//为宝马320系列生产配件  
public class FactoryBMW320 implements AbstractFactory{  
      
    @Override  
    public Engine createEngine() {    
        return new EngineA();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionA();  
    }  
}  
//宝马523系列
public class FactoryBMW523 implements AbstractFactory {  
  
     @Override  
    public Engine createEngine() {    
        return new EngineB();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionB();  
    }  
 
 
}
访问者模式
  • 在被访问的类里面加一个对外提供接待访问者的接口。
  • 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。
    建造者模式
  • 数据基础类继承自同一个父类,访问者也继承自同一个类,但是定义了许多针对数据基础类的重载方法
//数据基础父类
public interface ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}
//数据基础子类
public class Keyboard  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
//访问者类
public interface ComputerPartVisitor {
   public void visit(Computer computer);
   public void visit(Mouse mouse);
   public void visit(Keyboard keyboard);
   public void visit(Monitor monitor);
}
享元模式
  • 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能
  • 用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
  • 实现相同接口的各种子类,一个有Dic字典的工厂。工厂判断该字典是否已经有该类型对象,如果有就返回已经存在的对象,
  • 和单例模式比较相似,但两者的意图不同,一个是为了节约内存,实现共享。一一个全局使用的类频繁地创建与销毁。
命令模式
  • 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令
  • 定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
  • 命令可以撤销或者持续添加
  • 适用场景,任何可以看做命令的场合
装饰模式
  • 装饰类继承自功能类,内部含有对功能类的引用并且在实现接口的方法时,可以添加自己的功能进去
abstract Class Coffee { public abstract void Drink(); }
Class LightCoffee:Coffee{ public void Drink(){  Console.WriteLine("来杯淡咖啡") } }
abstract Class CoffeeDecorator :Coffee{ protected Coffee co;  public abstract void AddSomething(); }
//然后我们就可以不断的进行装饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值