装饰者模式:定义是在不改变原对象功能的情况下,动态的给原对象添加新功能,相比于通过继承来扩展功能要灵活的多。
设计理念是:定义一个装饰者对原对象的一个封装
要点是:装饰者和被装饰者(需要被扩展功能的原对象)都有一个共同的超类,继承的是类型,而不是方法的复制
包含的角色:
抽象被装饰者:装饰者和被装饰者的共同超类,定义了具体被装饰者的公共行为。
具体被装饰者:继承抽象被装饰者,实现抽象被装饰者的公共方法
抽象装饰者:一个抽象类,也继承抽象被装饰者,继承的是类型,使装饰者和被装饰者处于一个类型下
具体装饰者:继承了抽象装饰者,给被装饰者时添加新功能
应用场景:手机有一个基础功能打电话,这个功能不能满足人们的需求了,就要给它加上一些新的功能,如发短信,上网,玩游戏,听音乐,看视频等等功能。。。。我们首先想到的是用继承来扩展,但是如果路人甲只要打电话、发短信的功能的,那么我们就原手机对象,加上发短信功能。。。而路人乙要能打电话、发短信、上网,那么又要继承。。。。。不同的人要的功能不一样就要写很多很多继承类了。。。会出现代码冗余,出现很多的子类,管理其他不方便。。。。。这时我们就可以使用装饰者模式来进行动态扩展了。
先来图简单说明下:丑了点,将就下
上代码:
抽象被装饰者,基类
public interface Phone {
public void gongneng();
}
具体被装饰者
public class Aphone implements Phone {
public void gongneng() {
System.out.println("能打电话");
}
}
抽象装饰者
public abstract class Decorator implements Phone{
protected Phone iphone;
public Decorator(Phone phone){
this.iphone=phone;
}
}
具体装饰者
public class AphoneDecorator extends Decorator {
public AphoneDecorator(Phone phone) {
super(phone);
}
//添加个发短信功能
public void gongneng(){
this.iphone.gongneng();
System.out.println("能发短信");
}
}
public class BphoneDecorator extends Decorator {
public BphoneDecorator(Phone phone) {
super(phone);
}
//给手机扩展一个上网功能
public void gongneng(){
this.iphone.gongneng();
System.out.println("能上网");
}
}
测试
public static void main(String[] args) {
Aphone iphone = new Aphone();
BphoneDecorator idecorator = new BphoneDecorator(iphone);
AphoneDecorator adecorator = new AphoneDecorator(idecorator);
adecorator.gongneng();
}
结果
能打电话
能上网
能发短信