标签:http pre const auto ima nts one 使用 public
装饰设计模式:就是使用被装饰类的一个子类的实例,在客户端这个子类的实例交给装饰类,是继承的替代方案
如一个手机设计
1、要设计一个手机,自带打电话功能,而手机属于一个接口
2、手机下面有个具体的子类,属于确定的对象,比如Iphone,但是Iphone也是一个手机,要实现手机接口
3、手机有比如彩铃、听音乐等功能,这些功能就属于装饰类,把它们弄成一个装饰类,也需要实现手机接口。
4、彩铃功能,属于继承第3部的装饰类的功能,比如设置彩铃是在手机打电话之前实现的。
5、听音乐功能,属于继承第3部的装饰类的功能,比如设置听音乐是在手机打电话之后实现的。
6、测试手机,首先创建Iphone手机的具体对象,而Iphone也是一个手机;实现手机装饰功能:彩铃、听音乐。
代码如下
package cn.idcast5; public interface Phone { public abstract void call(); }
package cn.idcast5; public class Iphone implements Phone{ @Override public void call() { // TODO Auto-generated method stub System.out.println("手机可以打电话了"); } }
package cn.idcast5; public abstract class PhoneDecorate implements Phone { private Phone p; public PhoneDecorate(Phone p) { this.p=p; } @Override public void call() { // TODO Auto-generated method stub this.p.call(); } }
package cn.idcast5; public class RingPhoneDecorate extends PhoneDecorate { public RingPhoneDecorate(Phone p) { super(p); } @Override public void call() { // TODO Auto-generated method stub System.out.println("手机可以听彩铃了"); super.call(); } }
package cn.idcast5; public class MusicPhoneDecorate extends PhoneDecorate { public MusicPhoneDecorate(Phone p) { super(p); // TODO Auto-generated constructor stub } @Override public void call() { // TODO Auto-generated method stub super.call(); System.out.println("手机可以听音乐了"); } }
package cn.idcast5; public class PhoneDemo { public static void main(String[] args) { Phone p = new Iphone(); PhoneDecorate pd = new RingPhoneDecorate(new MusicPhoneDecorate(p)); pd.call(); } }
结果显示为:
标签:http pre const auto ima nts one 使用 public
原文地址:http://www.cnblogs.com/zengjiao/p/6607000.html