zoukankan      html  css  js  c++  java
  • 装饰者模式

    定义一个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));
    	}
    }
    



  • 相关阅读:
    POJ-2096-Collecting Bugs(概率DP)
    2019ICPC南京网络赛总结
    LOJ-6285-数列分块入门9
    LOJ-6284-数列分块入门8
    LOJ-6283-数列分块7
    bzoj2049: [Sdoi2008]Cave 洞穴勘测
    bzoj1010: [HNOI2008]玩具装箱toy
    bzoj1597: [Usaco2008 Mar]土地购买
    bzoj1233: [Usaco2009Open]干草堆tower 单调队列优化dp
    bzoj2442&&codevs4654 单调队列优化dp
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053426.html
Copyright © 2011-2022 走看看