定义一个phone接口:
package f.struct_type_decorative_pattern;
public interface Phone {
public abstract void call();
}
定义一个iPhone实现phone接口:
package f.struct_type_decorative_pattern;
public class IPhone implements Phone{
@Override
public void call() {
System.out.println("手机可以打电话");
}
}
实现一个最基本的装饰者抽象类:
package f.struct_type_decorative_pattern;
/**
* 装饰的抽象类
* @author Administrator
*
*/
public abstract class PhoneDecorate implements Phone{
private Phone p;
public PhoneDecorate(Phone p) {
this.p = p;
}
@Override
public void call() {
this.p.call();
}
}
实现一个最基本的装饰者类:
package f.struct_type_decorative_pattern;
public class MusicPhoneDecorate extends PhoneDecorate{
public MusicPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手机可以听音乐了");
}
}
package f.struct_type_decorative_pattern;
public class RingPhoneDecorate extends PhoneDecorate {
public RingPhoneDecorate(Phone p) {
super(p);
}
public void call() {
System.out.println("手机可以听彩铃了");
super.call();
}
}
装饰者测试,层层功能的递加:
package f.struct_type_decorative_pattern;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 装饰者设计模式:
* 装饰模式就是使用被装饰类的一个子类的实例,
* 在客户端将这个子类的实例交给装饰类,是继
* 承的替代方案。
*
* 优点:
* 使用装饰模式,可以提供比继承更灵活的扩展
* 对象的功能,它可以动态的添加对象的功能,
* 并且可以随意的组合这些功能。
*
* 缺点:
* 正因为可以随意组合,所以就可能出现一些不
* 合理的逻辑。
*
* @author mzy
*
* 开始定义手机规则(interface)再到具体的手机(class)
* 给手机添加装饰(interface:彩铃、听音乐),给手机进行装饰
*
*
*
*
*
* 接口:定义规则
*
*/
public class DecorativeDemo01 {
public static void main(String[] args) {
Phone p = new IPhone();
p.call(); // 现在我的手机可以打电话了
System.out.println("-----------------");
// 需求:想在接电话前,听彩铃
PhoneDecorate pd = new RingPhoneDecorate(p);
pd.call();
System.out.println("-----------------");
// 需求:想在接完电话后,可以听音乐
pd = new MusicPhoneDecorate(p);
pd.call();
System.out.println("-----------------");
// 需求:在接前彩铃,接后音乐
// 自己提供装饰类
// 装饰模式可以任意组合
pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));
pd.call();
// 想想我们在IO流中的使用:多层的包装让使用更方便,就是装饰最好的体现
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
}
}