设计模式学习(一)

最近学习了命令模式,观察者模式,装饰者模式,工厂模式,抽象工厂模式,单例模式。

1·命令模式:

主要包含四个元素:

接收者:负责执行命令;

命令:是一个接口,用来做命令的载体;

具体命令:命令的实现类;

请求者:发送请求的人;

原理:

其实就是请求者向接收者发送请求,但是要把命令封装起来,减少请求者和接收者的耦合。(许多设计模式都是为了解耦)

总结
1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4.命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
适用情况
1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。


2·观察者模式

元素:

抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

原理:

被观察者就类似于一台电视,观察者是看电视的人,只有看电视的人才能获取到电视放映的节目信息,被观察者由其实现类实现,那些调用了被观察者接口的观察者们,执行了相关方法后,观察者的实现方法会将result返回给观察者。

是被观察者自己提供了一套方案给其他类使用,但是不清楚具体的观察者是谁的情况。

适用场景
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
 

3·装饰者模式

拓展一个对象的功能,但不改变其源码,比生成他的子类来重写更灵活(解耦)

比如一个麻雀,可以飞50米,new了一个麻雀之后,执行飞50米这个办法,然后自己写了一个再飞20米的方法,这样在不重写的前提下,做到了功能扩展。

4·工厂模式

算是很常用的一个设计模式了,原理指的是我们调用某个接口(A)实现类(Aimpl)中的方法时,但是又不想去new

它,或者说 这个接口的实现类是内部的,不允许我们来调用,那么我们创建一个自己的接口(B),其中增加一个getA()的方法,获取到A对象,在通过A对象的内置接口方法,获取到其内置实现类可以实现的属性和方法。

5·抽象工厂模式

设计某些系统时,需要提供一组相关的对象,但系统不希望用户直接将对象new出来进行使用(比如private的,提供服务方,)

而应用系统自动化的去创建他们。

思路:军队需要士兵提供武器,但不需要士兵亲自去建造,因此应该有一个武器厂来自动的生产武器,然后士兵来获取武器。

(这里,士兵就是用户,而武器厂,就是抽象工厂的模式具现)

关键:在一个abstract或interface中,定义方法,返回相关对象的实例,该抽象类让其子类重写这些方法而为为用户提供相关对象。

6·单例模式

单例模式指的是有些对象不需要被重复的生成,只提供一个实例,一般分为两种写法,分为懒汉式和饿汉式

懒汉式不会在初始化时new出这个单例对象,在调用时进行判断,对象为空则new,否则直接使用已经存在的对象;

饿汉式是在初始化时创建好单利对象,调用时直接使用。

要注意的是创建时应该将构造方法私有化,尽量将单例类中所有属性和方法私有化,静态化,考虑并发时,要加入线程安全关键字,sychornized或者valitile。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值