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());
    	}
    
    }
    

    看,方便吧

  • 相关阅读:
    sql优化
    es和solr
    RabbitMQ 整理
    redis分布式缓存
    redis集群
    drf-jwt第三方插件,DRF的三大认证的具体使用,多方式登陆的实现
    自定义路由组件,Django的admin后台管理,DRF的三大认证,jwt认证
    DRF视图家族
    导包补充,深度查询(深度序列化),十大接口
    三流,内部类,基表,表关系,断开表关联,外键字段属性
  • 原文地址:https://www.cnblogs.com/tenlee/p/4923834.html
Copyright © 2011-2022 走看看