设计模式:适配器、外观及模板方法模式

上午:适配器模式和外观模式的所有内容,适配器模式针对一个对象,外观模式针对一群对象

适配器:将一个对象包装,改变其接口(如充电头转换器,或实现鸭子类,改变其接口为火鸡的实现方式)

装饰者:将一个对象包装,增加新的行为和责任(如实现咖啡类,增加调料西米露、红豆)

外观模式:将一群对象包装,简化接口(类似命令模式的宏命令,一键操作)

 

下午:模板方法模式,定义算法的骨架,将实现延迟到子类

页数/内容

收获

235-242适配器模式

时间:9.10-9.25

时长:15min

需求:实现一个适配器

①定义一个适配器类

②实现想转换成的类型的接口

③利用构造器取得要适配的对象的引用,将其当做参数传进去

④实现②中接口的方法,方法体使用的是适配的对象里的方法

243-256适配器模式

时间:9.44-9.54

时长:10分钟

1、适配器模式定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

作用:让客户从实现的接口解耦,如果在一段时间之后需要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改

  1. 类适配器,需要多继承,而在Java中不支持多继承。类适配器继承原有类、适配类,从而使得类适配器可以响应用户的请求
  2. 对象适配器,只要实现原有的接口,然后将要适配的行为的类的方法,在适配器里面的原有接口方法里面实现
  3. 装饰者和适配器的区别:装饰者不改变接口,加入了责任,如星巴克咖啡加入各种调料和价格,层层装饰咖啡基类。适配器将一个接转变成另一个接口,看起来是A接口,但其实现的方法体是B接口的内容,如充电头转换器

257-274外观模式

时间:10.20-10.45

时长:25分钟

①外观模式不只是简化了接口,也将客户从组件的子系统中解耦。

②外观和适配器可以包装许多类,但是外观的意图是简化接口(类似命令模式的宏命令?),适配器的意图是将接口转换成不同接口

 

外观模式定义:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

设计原则--最少知识原则

优点:只和你的密友谈话,意思:在设计中,不要让太多的类耦合在一起,免得修改系统的一部分,就影响其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解

缺点:虽然减少了软件的维护成本,但是采用这个原则也会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时的性能

 

技术要点

1、当需要使用一个现有的类而其接口不符合需要时,就使用适配器

2、当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式

3、适配器改变接口以符合客户的期望

4、外观模式将客户从一个复杂的子系统中解耦(如一键看电视,不需要关注子系统的开屏幕、开音量、调频道)

5、实现适配器的复杂度由目标接口的大小而决定

6、实现外观模式需要将子系统组合进外观中,然后将工作委托给子系统执行

7、适配器有两种形式:类适配器、对象适配器。类适配器需要多继承(Java不允许)

8、可以为一个子系统设计一个或者多个外观模式

9、适配器:将一个对象包装,改变其接口(如充电头转换器)

装饰者:将一个对象包装,增加新的行为和责任(如实现咖啡类,增加调料西米露、红豆)

外观模式:将一群对象包装,简化接口(类似命令模式的宏命令,一键操作

      

页数/内容

收获

275-295模板方法模式

时间:2.50-3.05

时长:15min

模板方法模式定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤。简单说模板就是一个方法,它将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。

 

在模板方法里面也可以提供钩子。钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩由子类决定。钩子也可以提供条件控制或者对抽象类作出一些改变。

 

子类必须实现抽象类中的所有方法。

 

例子:泡茶和泡咖啡

  1. 把相同的动作放到一个抽象类的final方法中,final是防止子类改变方法执行步骤
  2. 不同的动作定义为抽象方法,在各自(茶、咖啡)的子类里面提供各自的实现

296-313模板方法模式

时间:3.30-3.50

时长:20min

好莱坞原则:允许低层(子类)组件将自己挂钩到系统上,但是高层(基类)组件会决定什么时候和怎样使用这些低层组件。即低层不要调用高层,高层调用低层。由超类主导一切,当它们需要的时候自然会去调用子类。工厂模式、观察者模式、模板方法模式都用了这个原则。

 

模板方法:子类决定如何实现算法中的步骤(可以用于创建框架,由框架控制如何做事情,而用户指定框架算法中每个步骤的细节)

策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为

工厂方法:由子类决定实例化哪个具体类

 

策略模式:定义一个算法家族,并让这些算法可以互换。因为每一个算法都被封装起来了,所以客户可以轻易使用不同的算法(如鸭子会不会飞,会不会叫)

模板方法模式:定义一个算法的大纲,由子类定义其中某些步骤的内容。模板方法在算法中的个别步骤可以有不同的实现细节,但是算法的结构依然维持不变

 

要点

1、模板方法定义了算法的步骤,把这些步骤的实现延迟到了子类

2、模板方法模式为我们提供了一种代码复用的重要技巧

3、模板方法的抽象类可以定义具体方法、抽象方法和钩子

4、抽象方法由子类实现,子类要实现抽象类的所有方法

5、钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它

6、为了防止子类改变模板方法中的算法,可以将模板方法声明为final

7、好莱坞原则:超类主导一切,决定何时如何调用子类

8、策略模式和模板方法模式都封装算法,策略用组合,模板用继承的方式

9、工厂方法是模板方法的一种特殊版本

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值