一、概述。
装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案。
优点:
使用装饰模式,可以提供比继承更为灵活的扩展对象的功能,它可以 动态的添加对象的功能,并且可以随意的组合这些功能。
缺点:
正因为可以随意的组合,所以就可能出现一些不合理的逻辑。
二、使用。
装饰设计模式的组成:
接口
对接口的具体实现
抽象装饰类
具体装饰类
例:对手机进行功能的扩展。
1: 定义一个接口:定义的是那个被装饰的抽象的东西
package me.zhouyou.pattern;
/*
* 定义一个接口:定义的是那个被装饰的抽象的东西
*/
public interface Phone {
public void call();
}
2: 定义一个具体的事物类:
package me.zhouyou.pattern;
/*
* 对接口的具体实现
*/
public class PhoneImpl implements Phone {
@Override
public void call() {
System.out.println("打电话");
}
}
3: 定义一个抽象的装饰类:
package me.zhouyou.pattern;
public abstract class PhoneDecorate implements Phone {
private Phone p;
// 提供一个带参构造,传入一个被操作的类
public PhoneDecorate(Phone p){
this.p = p;
}
// 类中有最基本的方法
@Override
public void call() {
this.p.call();
}
}
4:具体的装饰类:
package me.zhouyou.pattern;
// 提供一个彩铃装饰的具体实现类
public class MusicPhoneDecorat extends PhoneDecorate{
public MusicPhoneDecorat(Phone p) {
super(p);
}
@Override
public void call() {
System.out.println("手机可以听彩铃了");
super.call();
}
}
测试类:
package me.zhouyou.pattern;
/*
* 装饰设计模式-测试类。
*/
public class PhoneDemo {
public static void main(String[] args) {
Phone p = new PhoneImpl();
p.call(); // 最基础的打电话功能
System.out.println("----------");
PhoneDecorate pd = new MusicPhoneDecorat(p);
pd.call(); // 增加彩铃装饰后
}
}
打印结果:
打电话
———-
手机可以听彩铃了
打电话
如果我们后续还要新添加功能的话,只要再创建一个装饰类来实现就可以了,比如再添加一个打电话后游戏的功能:
package me.zhouyou.pattern;
public class GameDecorate extends PhoneDecorate {
public GameDecorate(Phone p) {
super(p);
// TODO Auto-generated constructor stub
}
@Override
public void call() {
super.call();
System.out.println("手机可以玩游戏了");
}
}
测试类:
package me.zhouyou.pattern;
/*
* 装饰设计模式-测试类。
*/
public class PhoneDemo {
public static void main(String[] args) {
Phone p = new PhoneImpl();
p.call(); // 最基础的打电话功能
System.out.println("----------");
PhoneDecorate pd = new MusicPhoneDecorat(p);
pd.call(); // 增加彩铃装饰后
System.out.println("----------");
pd = new MusicPhoneDecorat(new GameDecorate(p));
pd.call();
}
}
结果:
打电话
———-
手机可以听彩铃了
打电话
———-
手机可以听彩铃了
打电话
手机可以玩游戏了