博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——装饰模式
阅读量:5791 次
发布时间:2019-06-18

本文共 2326 字,大约阅读时间需要 7 分钟。

装饰( Decorator)模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。

转载请说明出处:

假如现在要一个会跑的车,我们会这样做:

package com.meritit;public interface Car {		public void show();	public void run();}
package com.meritit;public class RunCar implements Car{	public void run(){		System.out.println("可以跑");	}	@Override	public void show() {		this.run();	}}
假如又要一个会跑又会飞的车,我们这样做

package com.meritit;public class FlyCar implements Car{	public void run(){		System.out.println("可以跑");	}		public void fly(){		System.out.println("可以飞");	}	@Override	public void show() {		this.run();		this.fly();			}}
假如还要一个会跑会游的车

package com.meritit;public class SwimCar implements Car{	@Override	public void show() {		this.run();		this.swim();	}	@Override	public void run() {		System.out.println("可以跑");			}		public void swim(){		System.out.println("可以游");	}}
像这样的要根据不同的需要给对象添加功能,我们可以用装饰模式,装饰模式的结构如图:

现在我们使用装饰模式来实现对汽车的装饰:

package com.meritit;public interface Car {		public void show();	public void run();}
package com.meritit;public class RunCar implements Car{	public void run(){		System.out.println("可以跑");	}	@Override	public void show() {		this.run();	}}
创建一个抽象的装饰器,持有要装饰的对象

package com.meritit;public abstract class CarDecorator {	private Car car;		public CarDecorator(Car car){		this.car = car;	}		public abstract void show();	public Car getCar() {		return car;	}	public void setCar(Car car) {		this.car = car;	}		}
具体的装饰

package com.meritit;public class FlyCarDecorator extends CarDecorator{	public FlyCarDecorator(Car car) {		super(car);	}	@Override	public void show() {		this.getCar().run();		this.fly();	}		public void fly(){		System.out.println("可以飞");	}}
最后的结果

package com.meritit;public class MainClass {	public static void main(String[] args) {		Car car = new RunCar();		CarDecorator decorator = new FlyCarDecorator(car);		decorator.show();	}}

装饰模式的作用:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更灵活。

设计原则:

1、多用组合、少用继承。

利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。

2、类应该设计的对扩展开放,对修改关闭

要点:

1. 装饰者和被装饰对象有相同的超类型。

2. 可以用一个或多个装饰者包装一个对象。

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

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

5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

6. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。

7. 适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。

转载于:https://www.cnblogs.com/lanzhi/p/6469752.html

你可能感兴趣的文章
如何查看python selenium的api
查看>>
Python_Mix*random模块,time模块,sys模块,os模块
查看>>
iframe刷新问题
查看>>
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
vue-cli项目打包需要修改的路径问题
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
[SpringBoot] - 配置文件的多种形式及优先级
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>
debian7 + wheezy + chromium + flashplayer
查看>>
AOP
查看>>
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>
uva 11468 - Substring(AC自己主动机+概率)
查看>>
Mysql 数据备份与恢复,用户创建,授权
查看>>
沉思录
查看>>
Angular.js中的$injector服务
查看>>
构建之法读书笔记01
查看>>
linux - lsof 命令最佳实践
查看>>