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

    **装饰者模式目标**

    把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活

    装饰者模式角色

    • 抽象组件角色

    给出一个抽象接口

    • 具体组件角色

    定义一个将要增加附加功能的类,相当于父类

    • 抽象装饰者角色

    持有一个组件对象的实例,并且实现抽象组件接口

    • 具体装饰者角色

    负责给组件对象添加附加的功能,相当于子类

    装饰者模式示例

    以一件商品被卖出为例,

    //抽象组件角色 Commodity.java
    public interface Commodity {
    
    	public void beSoldOut();
    }
    
    
    //具体组件角色
    public class Book implements Commodity {
    
    	@Override
    	public void beSoldOut() {
    		System.out.println("书被卖出去了");
    	}
    }
    
    
    
    //抽象装饰者角色 Decorator.java
    //实现了抽象组件接口
    public abstract class Decorator implements Commodity {
    
    	Commodity commodity; //持有组件对象的实例
    	
    	Decorator(Commodity commodity){
    		this.commodity=commodity;
    	}
    	@Override
    	public void beSoldOut() {
    		commodity.beSoldOut();
    	}
    
    }
    
    
    
    //具体装饰者角色:增加了折扣的功能 DiscountDecorator.java
    public class DiscountDecorator extends Decorator {
    
    	public DiscountDecorator(Commodity commodity) {
    		super(commodity);
    	}
    
    	public void discount(){
    		System.out.println("再送一件相同的商品");
    	}
    	@Override
    	public void beSoldOut() {
    		// TODO Auto-generated method stub
    		super.beSoldOut();
    		discount();
    	}
    
    }
    
    
    
    //具体装饰者角色:再次折扣促销  DiscountAgainDecorator.java 
    public class DiscountAgainDecorator extends Decorator {
    
    	
    	public DiscountAgainDecorator(Commodity commodity){
    		super(commodity);
    	}
    	
    	public void discountAgain(){
    		System.out.println("再送一件价格低一点的商品");
    	}
    	
    	@Override
    	public void beSoldOut() {
    		super.beSoldOut();
    		discountAgain();
    	}
    }
    
    
    //客户端测试类 testDecorator.java
    
    public class testDecorator {
    
    	public void static main(String[] args) {
    		Commodity book = new Book();
    		Decorator decorator = new DiscountAgainDecorator(new DiscountDecorator(book));
    		decorator.beSoldOut();
    	}
    }
    
    
    

    测试结果是

    书被卖出去了
    再送一件相同的商品
    再送一件价格低一点的商品
    
    
  • 相关阅读:
    如何在ASP.NET Core项目启动时执行异步定时任务
    计算机组成原理实验:Cache控制器设计实验 问题解决
    jenkins + gitlab 利用pipeline 完整构建项目
    利用K8S的jenkins动态slave+gitee + dockerhub实现完整的develops
    pycharm 上传代码到码云
    关于CI/CD的实践(二 提交阶段流水线)
    sonarqube-7.8 安装
    关于CI/CD的实践(一 流程规划)
    ubutun 安装nvm管理node
    关于容器的健康检查 Health Check
  • 原文地址:https://www.cnblogs.com/sweiqi/p/6111816.html
Copyright © 2011-2022 走看看