zoukankan      html  css  js  c++  java
  • Decorator模式设计模式

    装饰者模式定义:动态地将责任附加到对象上。

    若要扩展功能。装饰者提供了比继续更有弹性的替代方案。

    简单定义:包装一个对象。以提供新的行为

    装饰者模式能够有效应对类爆炸问题。


    OO原则:

    对扩展开放,对改动关闭。

    以书中的StarbuzzCoffee为例:

    Beverage.java(饮料抽象类)

    package headfirst.decorator.starbuzz;
    
    public abstract class Beverage {
    	String description = "Unknown Beverage";
      
    	public String getDescription() {
    		return description;
    	}
     
    	public abstract double cost();
    }

    CondimentDecorator.java(调料抽象类)

    package headfirst.decorator.starbuzz;
    
    public abstract class CondimentDecorator extends Beverage {
    	public abstract String getDescription();
    }

    DarkRoast.java(饮料详细类)

    package headfirst.decorator.starbuzz;
    
    public class DarkRoast extends Beverage {
    	public DarkRoast() {
    		description = "Dark Roast Coffee";
    	}
     
    	public double cost() {
    		return .99;
    	}
    }


    Espresso.java

    package headfirst.decorator.starbuzz;
    
    public class Espresso extends Beverage {
      
    	public Espresso() {
    		description = "Espresso";
    	}
      
    	public double cost() {
    		return 1.99;
    	}
    }

    HouseBlend.java

    package headfirst.decorator.starbuzz;
    
    public class HouseBlend extends Beverage {
    	public HouseBlend() {
    		description = "House Blend Coffee";
    	}
     
    	public double cost() {
    		return .89;
    	}
    }

    Mocha.java(调料详细类)

    package headfirst.decorator.starbuzz;
    
    public class Mocha extends CondimentDecorator {
    	Beverage beverage;
     
    	public Mocha(Beverage beverage) {
    		this.beverage = beverage;
    	}
     
    	public String getDescription() {
    		return beverage.getDescription() + ", Mocha";
    	}
     
    	public double cost() {
    		return .20 + beverage.cost();
    	}
    }

    Soy.java

    package headfirst.decorator.starbuzz;
    
    public class Soy extends CondimentDecorator {
    	Beverage beverage;
    
    	public Soy(Beverage beverage) {
    		this.beverage = beverage;
    	}
    
    	public String getDescription() {
    		return beverage.getDescription() + ", Soy";
    	}
    
    	public double cost() {
    		return .15 + beverage.cost();
    	}
    }

    Whip.java

    package headfirst.decorator.starbuzz;
     
    public class Whip extends CondimentDecorator {
    	Beverage beverage;
     
    	public Whip(Beverage beverage) {
    		this.beverage = beverage;
    	}
     
    	public String getDescription() {
    		return beverage.getDescription() + ", Whip";
    	}
     
    	public double cost() {
    		return .10 + beverage.cost();
    	}
    }

    測试类:StarbuzzCoffee.java

    package headfirst.decorator.starbuzz;
    
    public class StarbuzzCoffee {
     
    	public static void main(String args[]) {
    		Beverage beverage = new Espresso();
    		System.out.println(beverage.getDescription() 
    				+ " $" + beverage.cost());
     
    		Beverage beverage2 = new DarkRoast();
    		beverage2 = new Mocha(beverage2);
    		beverage2 = new Mocha(beverage2);
    		beverage2 = new Whip(beverage2);
    		System.out.println(beverage2.getDescription() 
    				+ " $" + beverage2.cost());
     
    		Beverage beverage3 = new HouseBlend();
    		beverage3 = new Soy(beverage3);
    		beverage3 = new Mocha(beverage3);
    		beverage3 = new Whip(beverage3);
    		System.out.println(beverage3.getDescription() 
    				+ " $" + beverage3.cost());
    	}
    }


    输出:

    Espresso $1.99
    Dark Roast Coffee, Mocha, Mocha, Whip $1.49
    House Blend Coffee, Soy, Mocha, Whip $1.34


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    虚拟机网络模型详解,看这篇就够了(图文并茂)
    快速理解 VirtualBox 的四种网络连接方式
    Linux下桥接模式详解一
    CentOS7 下VNC Server远程桌面配置详解
    BAN如何下载?
    SNS交换机(OEM博科FC交换机)怎样设置密码策略
    SNS交换机(OEM博科FC交换机)的端口状态及排查流程说明
    SNS2124(OEM博科FC交换机)忘记密码,密码初始化
    博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)
    手淫让我付出了沉重的代价
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4678650.html
Copyright © 2011-2022 走看看