浅谈设计模式

看完《head first 设计模式》这本书,做个笔记方便后面复习。书中最后有几句话印象很深刻--“尽可能的用最简单的方式解决问题,你的目标应该是简单,而不是如何在问题中应用设计模式”。

设计原则

学习设计模式必须先直到设计原则,因为设计模式是不同场景下设计原则的体现方式 --OO设计原则 是 面向对象

  1. 封装变化:将程序中变化和不变的代码分开,一方面可以复用代码,也能提高代码利用率,并且方便管理
  2. 多用组合,少用继承,对拓展开放,对修改关闭;
  3. 针对接口编程,不针对实现编程:该观点针对的是使用者,这样可以在改变功能代码时不用修改使用者的代码
  4. 依赖倒置:一般是底层组件依赖搞成组件,依赖倒置是组件依赖地城组件,方便解耦,设计时候避免依赖。实现是尽量使用抽象类,而不是具体类。
  5. 最少知道原则:减少对象之间的交互,即对象之间的调用应尽可能的简单,避免多次相互调用。例如a对象调用b对象功能需要连续调用的c、d、e方法,那么可以将者三个方法调用封装在一个方法内,这样外部调用是只需要调用一次就可以实现需要的功能,不需要知道b对象内调用哪些方法和对象
  6. 好莱坞原则:由超类主控一切,需要的时候会调用子类,子类不会主动调用父类。目标依然是在于解耦,避免高层和底层组件之间有明显的环状依赖
  7. 单一原则(单一责任):一个类应该只有一个引起变化的原因。

 

 

1.策略模式 --

遵循原则:多用组合,少用继承、封装变化

通过定义算法族:将会变化的部分封装起来,使他们可以相互替换,该模式让算法的变化独立于是使用算法的客户;

简单理解起来就是再用组合的方式先将代码中变化的和不变化的部分分开,将变化的部分封装起来,例如汽车有高中低档之分,假如差别是在发动机上,那么发动机就是会变化的部分,完全可以定义一个发动机接口,不同级别的发动机功能来通过实现类实现,最后用组合的方式整合到汽车模型中实现发动机的功能。这样当需要替换发动机的时候直接将对应的发动机类注入汽车类中,不用修改汽车类中的代码;

2.观察者模式

观察者主要体现在一对多的依赖关系上。当一个对象状态改变要通知其他对象,并且被通知的对象要自动更新(一般被观察者只有一个,观察者有多个);

常见的例子你订阅了一个杂志,杂志社出来新杂志后会有邮件发给你。不只是发给你,是发给订阅这个杂志地 所有人。其实也就两部一个是观察者注册(订阅杂志),杂志社通知订阅者。

注册:这个很好实现,可以在被观察者中定义一个集合,一个注册的方法(向集合中添加订阅者对象);每当有新的观察者要订阅是,先调用被观察者的注册方法,将对象添加进被观察者的集合中。这样被观察者就知道谁订阅了。

通知:当杂志设出新杂志了,对通过遍历集合,调用每一个观察者的更新方法。当然观察者要有一个统一的方法,可以是实现同一个接口或继承同一个抽象类。

3.装饰模式

原则:对拓展开放,对修改关闭;

装饰模式可以简单理解成是给自己包装一层外壳。可以理解成需要在原来的功能增加新的功能或者是依赖原来的功能,某种原因不能修改原来的代码,可以通过新定义一个类,将原来的对象组合进去;举个简单的代码

public class A{ //对象A的功能
   public A();
   pubic done(){
       xxxx; //A对象的功能
   }
}

//B在A的基础上扩展功能
public chass B{
  private A a;
  pubic B(A a){
     this.a =a;
  }
  public done(){
     //自己定义的方法
    xxxx;
    a.done;//需要对象A功能

  }
}

//使用
Public  class C{
public void test(){
 B b = new B(new A);
 b.done();//实现在A的基础上扩展新功能有没有改动A 的代吗;
}
}

4.工厂模式

类比工厂,我们日常生活用品都不是自己生产的,由工厂生产。同样对象也可以这样创建,优点是将对象的创建和使用分开,这样代码看起来简洁,并且如果对象创建比较复杂,工厂模式可以提高代码复用率,如果后期需要修改,那么你不可能每一个地方都要修改,用工厂方法只需要改一个地方就可以了。

5.单例模式

确保只有一个实例,提供给一个全局访问点。(可能你写过单例,但是你知道他叫单例模式)。个人刚开始是理解成一种特殊的工厂模式,没想到有一个专属模式

6.命令模式

命令模式的使用场景可以类比成遥控器和上面的按钮。遥控器是调用者,按钮是对象,每一个对象对应一个功能。将发出的请求对象和接受与执行这些请求的对象分割开来,要控制不需要知道执行的是什么命令,只要知道是接口的方法方法就行。下面是一个简单的案例

简单测试:
public class RemoteControlTest{
 public static void main(String[] args){
//创建一个控制器,控制器中传入一个命令对象
    SimpleRemoteControl relote = new SimpleRemoteControl();
    Lignt lignt = new Lignt(); //创建一个电灯对象
   LigntOnComment lightOn = new LightOnComment(lignt);//创建电灯的命令对象,并的传入电灯对象
   relote.setCommant(lightOn);//控制器中传入一个命令对象
   relote.buttonWasPress();//按下键 执行命令
 }


}
//控制器对象,也是调用者,传进去一个命令对象
class SimpleRemoteControl{
  Commant solt;//执行命令对象

  public SimpleRemoteControl(){}

  public void setCommant( Commant solt){
    this.solt = solt;
  
  }

 Public void buttonWaspresssed(){
    solt.execute(); //执行命令本质是命令对象执行
 }
}

public interface Comment{ //命令接口,只有一个方法,执行
 public void execute();
}
public class LigntOnComment implements Command{
    Lignt lignt;
    public LigntOnComment(Lignt lignt){
        this.lignt = lignt;
   }
  public void execute(){
     lignt.on();//执行器调用对应的方法
 }
}
//对象灯 执行功能
class Lignt{
  public void on(){
   System.out.println("灯亮了");
 }
  public void off(){
   System.out.println("灯关了");
 }
}

7.适配器模式

功能类似生活中常见的转接头。将一个接口转换成另外一个,使原本两个不匹配的接口能组合使用。

一般更细分为对象适配器和类适配器,其中类适配器用到多重继承

8.外观模式

外观模式提供一个统一的接口来访问子系统中的一群接口,外观上定义一个搞成接口,让系统更容易使用

9.模板方法

模板方法定义了一个算法的步骤或流程,允许子类为一个或多个步骤提供实现,举个例子,泡茶和冲咖啡的步骤是相同

都是先添加料(咖啡或茶叶)--> 导入开水-->等待-->喝,简单来说就是步骤相同,细节不同 。那么可以将这个流程抽成一个模板方法,具体怎么做的让子类或实现类来做

10.迭代器

提供一种方法顺序访问一个聚合对象中的各个原属,又不暴漏内部的表示。如果将游走的任务放在迭代器上,能够简化聚合的接口。如果看过iterater类的源码,这个很容易理解

11.组合模式

将对象组合成属性结构来表示整体和部分的层次结构,例如叶节点和根节点的关系。祝贺能土壤和胡以一致的方式处理个别对象或对象组合,

12.状态模式

状态模式和策略模式是双胞胎,区别是他们的意图不同

状态模式允许对象内部状态改变时改变它的行为,对象看起来像是修改了他的类,而客户并不知道具体是哪个对象执行;

策略模式需要客户指定哪一个对象

13.代理模式

为另一个对象他提供一个替身或展位夫以控制对这个对象的访问。和装饰者区别是装饰者是增加行为,代理模式是控制访问

14.符合模式 经典mvc

mvc模式分明指mode(模型),view(视图),controller(控制器);在开发中也有人说三层架构等。

  • 视图:用来显示数据和状态
  • 控制器:获取用户输入的数据并解读对模型的操作
  • 模型:模型只有所有的数据、状态和逻辑,对外只提供接口并将状态发送给观察者

mvc中用到设计模式

  •  观察者模式:模型实现了观察者模式,利用观察者模式让控制器和视图随最新的状态改变而更新。模型又完全独立于是视图和控制器。
  • 组合模式:视图实现组合模式,节点展现层级关系,并且状态更新时只需要通知最顶成组件即可。
  • 策略模式:视图和控制器实现了策略模式,视图是一个对象可以调整使用不同的策略对象,控制器提供策略。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值