zoukankan      html  css  js  c++  java
  • Java设计模式(三)-修饰模式

    我们都知道。能够使用两种方式给一个类或者对象加入行为。

            一是使用继承。继承是给一个类加入行为的比較有效的途径。通过使用继承,能够使得子类在拥有自身方法的同一时候,还能够拥有父类的方法。可是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制添加行为的方式和时机。

            二是使用关联。组合即将一个对象嵌入到还有一个对象中,由还有一个对象来决定是否引用该对象来扩展自己的行为。

    这是一种动态的方式,我们能够在应用程序中动态的控制。

            与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,能够使系统更加easy维护。可是它的缺点就在于要创建比继承很多其它的对象

    一、装饰者的定义:

        装饰着模式动态的将责任附加到对象上,若想要扩展功能,装饰着提供比继承更有弹性的替代方案。

    二、装饰着模式的UML图:

         Compoent类:抽象类,每一个组件能够单独使用它。或者包装起来使用

         ConcreteCompoent类:动态载入新行为的对象。继承于Compoent

         Decorator类:装饰着共同实现的接口,能够使抽象类

         ConcreteDecorator1、ConcreteDecorator2类:装饰实例,装饰者包着Compent


    三、应用场景:

       Startbuzz是以扩张速度最快的的咖啡连锁店。由于扩张太快。他们准备更新订单系统。以供应需求。他们原先的设计是这种。  

         购买咖啡时,能够要求在当中增加各种调料。比如:牛奶(Milk)、豆浆(Soy)、摩卡(Mocha)。Startbuzz会依据不同的调料收取不同的费用,所以订单必须考虑到调料部分。。

    这是他们的第一次尝试。。。


    解决方式:


    四、编写代码

    Compotemt:Beverage类

    	//@file:beverage.java
    	public abstract class Beverage {	
    		String description = "Unknown Beverage";
    		public String getDescription(){
    			return description;
    		}	
    		public abstract double cost();
    	}

    ConcreteCompotemt:Espresso类

    	//浓缩咖啡
    	//@file:Espresso.java
    	public class Espresso extends Beverage {
    	<span style="white-space:pre">	</span>public Espresso(){
    			description = "Espresso";
    		}
    		@Override
    		public double cost() {
    			return 1;
    		}
    	}
    CondimentDecoratorHouseBlend

    	//@file:HouseBlend.java  、
    	//深烤烘焙
    	public class HouseBlend extends Beverage {
    		public HouseBlend(){
    			description = "HouseBlend";
    		}
    		@Override
    		public double cost() {
    			return 0.5;
    		}
    	}
    DecoratorCondimentDecorator
            //@file:CondimentDecorator.java
    	public abstract class CondimentDecorator extends Beverage{
    		abstract public String getDescription();
    	}

    ConcreteDecoratorMilk

    	//file:Milk.java  牛奶味道的调料
    	public class Milk extends CondimentDecorator {
    	
    		Beverage beverage;
    		public Milk(Beverage beverage){
    			this.beverage = beverage;
    		}
    		@Override
    		public String getDescription() {
    			return beverage.getDescription()+"-Milk";
    		}
    		@Override
    		public double cost() {
    			return beverage.cost()+2.0;
    		}
    	}

    ConcreteDecorator:Mocha

    //摩卡味道的调料
    	public class Mocha extends CondimentDecorator {
    		Beverage beverage;
    		public Mocha(Beverage beverage){
    			this.beverage = beverage;
    		}
    		@Override
    		public String getDescription() {
    			return beverage.getDescription()+"-Mocha";
    		}
    		@Override
    		public double cost() {
    			return beverage.cost()+3.0;
    		}
    	}

    ConcreteCDecoratorSoy

    	//豆浆味道的调料
    	public class Soy extends CondimentDecorator {
    		Beverage beverage;
    		public Soy(Beverage beverage){
    			this.beverage = beverage;
    		}
    		@Override
    		public String getDescription() {
    			return beverage.getDescription()+"-Soy";
    		}
    		@Override
    		public double cost() {
    			return beverage.cost()+4.0;
    		}
    	}

    開始下单啦!!!

    public class OrderApp {
    	public static void main(String[] args) {
    		Beverage  beverage1 = new HouseBlend();
    		beverage1 = new Milk(beverage1);
    		beverage1 = new Mocha(beverage1);
    		beverage1 = new Soy(beverage1);
    		System.out.println("beverage1 description:"+beverage1.getDescription()+"
    cost:"+beverage1.cost());
    		
    		Beverage  beverage2 = new Espresso();
    		beverage2= new Milk(beverage2);
    		beverage2 = new Mocha(beverage2);
    		System.out.println("beverage2 description:"+beverage2.getDescription()+"
    cost:"+beverage2.cost());
    	}
    }

    output:

    beverage1 description:HouseBlend-Milk-Mocha-Soy
    cost:9.5
    beverage2 description:Espresso-Milk-Mocha
    cost:6.0

    
    

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

  • 相关阅读:
    git基本操作及设置
    5-13 多页面打包配置
    笔记待整理
    单例模式在多线程下的多种实现模式
    面试题小练习1106
    求两个字符串的最大共有子串
    单例模式
    静态初始化一个二维数组并将二维数组排序并输出
    java中数组的基本知识
    关于break语句如何结束多重循环的嵌套
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4841271.html
Copyright © 2011-2022 走看看