赞
踩
装饰者模式是结构性设计模式之一,其在不必改变类文件及不使用继承的情况下,动态地扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
装饰着模式的结构图:
如上结构图所示,装饰者模式中有如下角色:
装饰者模式在生活中有很多例子,我们这里来给一个普通的人【原来只会走路】学运动技能【新学会了游泳 + 拳击】后变大师的例子来说明。
(1)抽象组件:
我们先定义一个人的抽象类,里面有运动的抽象方法。
public abstract class Person {
/**
* Person 人有可以运动的抽象方法
*/
public abstract void sport();
}
(2)组件具体实现类:
被装饰的具体对象,这里是具体的一个普通人,作为一个普通人他当然会运动,当然在未被装饰的情况下他只会走路。
public class CommonPerson extends Person {
@Override
public void sport() {
System.out.println("普通人运动只会走路");
}
}
(3)抽象装饰者:
抽象装饰者保证了一个对抽象组件的引用,方便调用被装饰对象中的方法。在这里运动大师需要持有人(Person)的引用,方便教授他其他运动,最终成为运动健将。
public abstract class Master extends Person {
private Person mPerson;
public Master(Person person) {
mPerson = person;
}
@Override
public void sport() {
mPerson.sport();
}
}
(4)装饰者具体实现类:
这里有两个装饰者具体实现类,分别是宁泽涛跟邹市明,他们(装饰者)负责向普通人(被装饰者)教授游泳跟拳击。
public class Ningzetao extends Master {
public Ningzetao(Person person){
super(person)
}
@Override
public void sport() {
super.sport();
teachSwimming();
}
public void teachSwimming(){
System.out.println("宁泽涛教普通人游泳");
}
}
public class Zoushiming extends Master {
public Zoushiming(Person person){
super(person)
}
@Override
public void sport() {
super.sport();
teachBoxing();
}
public void teachBoxing(){
System.out.println("邹市明教普通人拳击");
}
}
(5)客户端调用:
经过宁泽涛跟邹市明的教导后,普通人经过装饰后,除了会走路之外,也学会了游泳跟拳击。
public class Client {
public static void main (String[] args) {
//创建普通人,只会走路
CommonPerson mCommonPerson = new CommonPerson();
//宁泽涛教普通人学游泳,普通人学会了游泳
Ningzetao mNingzetao = new Ningzetao(mCommonPerson);
mNingzetao.sport();
//邹市明教普通人学拳击,普通人学会了拳击
Zoushiming mZoushiming = new Zoushiming(mCommonPerson);
mZoushiming.sport();
}
}
优点:
缺点:
后记:
乍一看装饰者模式跟代理模式好像,其实不然,两者最大的区别是:
装饰模式应该为所装饰的对象增强功能;
而代理模式对代理的对象施加控制,并不提供对象本身的增强功能。
可参考:
Java设计模式之代理模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。