七种常见结构型模式的描述总结与代码分析 (5)

「被装饰者」MochaCoffee

public class MochaCoffee extends Coffee { public MochaCoffee() { setDes("摩卡咖啡"); setPrice(5.5f); } @Override protected float cost() { return getPrice(); } }

「抽象装饰者」Decorator

public class Decorator extends Coffee { private Coffee coffee; public Decorator(Coffee drink) { this.coffee = drink; } @Override protected float cost() { return getPrice() + coffee.cost(); } @Override public String getDes() { return coffee.getDes() + "加" + super.getDes(); } }

「具体装饰者」SugarDecorator

public class SugarDecorator extends Decorator{ public SugarDecorator(Coffee coffee) { super(coffee); setDes("糖"); setPrice(1.0f); } }

「具体装饰者」MilkDecorator

public class MilkDecorator extends Decorator{ public MilkDecorator(Coffee coffee) { super(coffee); setDes("牛奶"); setPrice(2.0f); } }

「测试类」Client

public class Client { /** * 点一杯 加两份糖一份牛奶的摩卡咖啡 */ @Test public void test01() { Coffee order = new MochaCoffee(); System.out.println(order.getDes() + ",价格:" + order.cost()); //加两份糖 order = new SugarDecorator(new SugarDecorator(order)); System.out.println(order.getDes() + ",价格:" + order.cost()); //加一份牛奶 order = new MilkDecorator(order); System.out.println(order.getDes() + ",价格:" + order.cost()); } }

「结果」result

摩卡咖啡,价格:5.5 摩卡咖啡加糖加糖,价格:7.5 摩卡咖啡加糖加糖加牛奶,价格:9.5 在 Java IO 流中的应用

七种常见结构型模式的描述总结与代码分析

在上图所示的关系中

实体类是 InputStream

被装饰者是FileInputStream、StringBufferInputStream、ByteArrayInputStream

抽象装饰者是FilterInputStream

具体装饰者是BufferInputStream、DataInputStream、LineNumberInputStream

具体使用如下:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\a.txt")); 装饰者模式总结

1、利用继承设计子类,只能在编译时静态决定,并且所有子类都会继承相同的行为;利用组合扩展对象,就可以在运行时动态的进行扩展。

2、装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被装饰者)的场合,都可以用装饰过的对象代替原始对象。

3、可以用一个或多个装饰者包装一个对象(被装饰者)。

4、装饰者可以在所委托的装饰者行为之前或之后加上自己的行为,以达到特定的目的。

5、被装饰者可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

6、装饰者会导致出现很多小对象,如果过度使用,会让程序变得复杂。

五、外观模式(Facade) 基本介绍

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,它为子系统中的一组接口提供一个统一的高层接口,使子系统更容易被使用

外观模式又称为门面模式,它是一种对象结构型模式。

模式结构

七种常见结构型模式的描述总结与代码分析

1、Client(客户端):调用者

2、Facade(外观类):即上述所讲的高层接口

3、SubSystem(子系统):被调用者

举例说明

想要使用电脑,你只需要按一下开机键(客户端),电脑的各个部件(子系统)就开始工作了,你不需要关心硬盘如何启动的,CPU怎么运转的等等,一切都交给内部程序(外观类)处理。

编写简单的程序模拟一下

「SubSystem」:电脑的几个部件 CPU、内存、硬盘

public class Cpu { //使用「单例模式--饿汉式」创建对象 private static Cpu instance = new Cpu(); private Cpu() { } public static Cpu getInstance() { return instance; } public void start() { System.out.println("CPU启动"); } public void stop() { System.out.println("CPU停止工作"); } } public class Memory { private static Memory instance = new Memory(); private Memory() { } public static Memory getInstance() { return instance; } public void start() { System.out.println("内存启动"); } public void stop() { System.out.println("内存停止工作"); } } public class HardDisk { private static HardDisk instance = new HardDisk(); private HardDisk() { } public static HardDisk getInstance() { return instance; } public void start() { System.out.println("硬盘启动"); } public void stop() { System.out.println("硬盘停止工作"); } }

「Facade」:电脑,统一管理开机关机中硬件的启动与停止

public class Computer { private Cpu cpu; private Memory memory; private HardDisk hardDisk; public Computer() { this.cpu = Cpu.getInstance(); this.memory = Memory.getInstance(); this.hardDisk = HardDisk.getInstance(); } /** * 开机 */ public void boot(){ cpu.start(); memory.start(); hardDisk.start(); } /** * 关机 */ public void shutdown(){ cpu.stop(); memory.stop(); hardDisk.stop(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywpyx.html