设计模式之装饰者模式

设计模式之装饰着模式

    装饰者模式其实就是为了增强类,增强类的要素

      a.增强类必须实现被增强类的接口

      b.增强类中必须含有被增强类的应用

  创建一个手机接口(Phone)  

/*
 * 创建一个手机接口
 */
public interface Phone {
	public abstract void call();
}

  创建手机的实现类(HuaWeiPhone)

/*
 * 	手机的实现类
 */
public class HuaWeiPhone implements Phone{
	@Override
	public void call() {
		System.out.println("打电话中......");
	}

}

  创建增强手机的实现类(在打电话之前需要响铃)

/**
 * 1.增强类必须和被增强类实现同一接口
 * 			实现Phone接口
 * 2.增强类中必须引用被增强类的对象
 *          引用HuaWeiPhone
 */
public class HuaWeiDecorate  implements Phone{

	private Phone HuaWeiPhone;
	public HuaWeiDecorate(Phone HuaWeiPhone) {
		this.HuaWeiPhone=HuaWeiPhone;
	}
	@Override
	public void call() {
		System.out.println("电话铃响了....");
		HuaWeiPhone.call();
	}
}

  测试方法:

        public static void main(String[] args) {
		HuaWeiPhone hwp=new HuaWeiPhone();
		HuaWeiDecorate hd=new HuaWeiDecorate(hwp);
		hd.call();
	}    

      在打完电话后想听音乐

public class HuaWeiDecorate1 implements Phone{

	private Phone HuaWeiPhone;
	public HuaWeiDecorate1(Phone HuaWeiPhone) {
		this.HuaWeiPhone=HuaWeiPhone;
	}
	@Override
	public void call() {
		HuaWeiPhone.call();
		System.out.println("音乐响了....");
	}
}

  测试方法:

        public static void main(String[] args) {
		HuaWeiPhone hwp=new HuaWeiPhone();
		HuaWeiDecorate hd=new HuaWeiDecorate(hwp);
		HuaWeiDecorate1 hd1=new HuaWeiDecorate1(hwp);
		hd.call();
		hd1.call();
	}

  这样我们就需要对于这个装饰类进行抽取出来,若果有多个装饰类这样我们就需要进行抽取

/*
 * 	手机的实现类
 */
public class HuaWeiPhone implements Phone{
	@Override
	public void call() {
		System.out.println("手机可以打电话 !");
	}

}

  

public class HuaWeiDecorate  extends DecorateClass{
	public HuaWeiDecorate(Phone p) {
		super(p);
	}
	@Override
	public void call() {
		System.out.println("电话铃响了....");
		super.call();
	}
}

  

public class HuaWeiDecorate1 extends DecorateClass{
	public HuaWeiDecorate1(Phone p) {
		super(p);
	}
	@Override
	public void call() {
		super.call();
		System.out.println("音乐响了");
	}
}

  

public  class DecorateClass implements Phone{
	private Phone p;
	public DecorateClass(Phone p) {
		this.p=p;
	}
	@Override
	public void call() {
		this.p.call();
	}
}

  

      测试类:

public static void main(String[] args) {
	HuaWeiPhone hwp=new HuaWeiPhone();
	Phone hd=new HuaWeiDecorate(hwp);
	Phone h=new HuaWeiDecorate1(hd);
	h.call();	
}

  

           

原文地址:https://www.cnblogs.com/fjkgrbk/p/Dacorate.html