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

    1、继承带来的问题

    引言:说威哥当年创业开店--卖豆浆!因豆浆纯,分店几乎开遍全县城所有村,由于发展的实在是太快了,所以急 于实现一套由计算机管理的自动化记账系统。

    主料:豆浆

    配料:糖 黑豆 五谷 鸡蛋…, 加一样配料加钱,每种豆浆的价格都不同。不过都是基于豆浆的价格进行加价。可以加多种配料。

    如果使用继承,每增加一种配料,就要新建好多好多类,比如黑豆五谷豆浆,黑豆五谷糖豆浆。会导致类爆炸!

    所以直接继承的方式是不行的。

    2、装饰者设计模式。

    意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。

    适用环境: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 处理那些可以撤消的职责。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

    装饰者模式,只用新建一个配料类即可,不需要新建所有可能的子类。

    涉及角色

      抽象组件:定义一个抽象接口,来规范准备附加功能的类。

      具体组件:将要被附加功能的类,实现抽象构件角色接口。

      抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。

      具体装饰:实现抽象装饰者角色,负责为具体构件添加额外功能。

      代码实现:

        Drink.java 被装饰者对象的接口

        DouJiang.java 具体的被装饰者对象, 

        Decorator.java 装饰者基类 

        EggDecorator.java 具体装饰者对象, 

        SugarDecorator.java 具体装饰者对象, 

        Test.java   测试

    3、代码

    Drink 接口类

    package com.day15;
    
    /**
     *1。最顶端,抽象组件,定义一个抽象接口
     * @author Administrator
     *
     */
    public interface Drink {
    	public String description();
    	public float cost();
    }
    

    DouJiang 类,实现Drink接口

    package com.day15;
    /**
     * 具体的装饰者类
     *抽象的被装饰者接口
     * @author Administrator
     *
     */
    public class DouJiang implements Drink{
    
    	private String name = "";
    	@Override
    	public String description() {
    		return "纯豆浆";
    	}
    
    	@Override
    	public float cost() {
    		return 3f;
    	}
    
    }
    

    Decorator 装饰者抽象类

    package com.day15;
    /**
     * 装饰者抽象类
     * @author Administrator
     *
     */
    public class Decorator implements Drink{
    
    	private Drink drink;//要装饰的对象
    	public Decorator(Drink drink) {
    		this.drink = drink;
    	}
    	@Override
    	public String description() {
    		return drink.description();
    	}
    
    	@Override
    	public float cost() {
    		return drink.cost();
    	}
    
    }
    

    EggDecorator 类

    package com.day15;
    
    public class EggDecorator extends Decorator {
    
    	public EggDecorator(Drink drink) {
    		super(drink);
    	}
    	@Override
    	public String description() {
    		return super.description() + " + 鸡蛋"; // 这里注意,返回是super + “”
    	}
    	@Override
    	public float cost() {
    		return super.cost() + 1.5f;
    	}
    }
    

    SugerDecorator 类

    package com.day15;
    
    public class SugerDecorator extends Decorator {
    
    	public SugerDecorator(Drink drink) {
    		super(drink);
    		// TODO Auto-generated constructor stub
    	}
    	
    	@Override
    	public String description() {
    		// TODO Auto-generated method stub
    		return super.description() + " + 加糖";
    	}
    	@Override
    	public float cost() {
    		// TODO Auto-generated method stub
    		return super.cost() + 0.5f;
    	}
    
    }
    

    Test 测试类

    package com.day15;
    
    public class Test {
    
    	public static void main(String[] args) {
    		Drink drink = new DouJiang();// 纯豆浆
    		SugerDecorator suger = new SugerDecorator(drink); //加糖
    		EggDecorator egg = new EggDecorator(suger);//加糖的又加鸡蛋
    		System.out.println(egg.description());
    		System.out.println(egg.cost());
    	}
    
    }
    

    看,方便吧

  • 相关阅读:
    Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL
    CACHE COHERENCE AND THE MESI PROTOCOL
    Multiprocessor Operating System Design Considerations SYMMETRIC MULTIPROCESSORS
    Organization SYMMETRIC MULTIPROCESSORS
    PARALLEL PROCESSING
    1分钟内发送差评邮件
    Secure Digital
    SYMMETRIC MULTIPROCESSORS
    A Taxonomy of Parallel Processor Architectures
    parallelism
  • 原文地址:https://www.cnblogs.com/tenlee/p/4923834.html
Copyright © 2011-2022 走看看