zoukankan      html  css  js  c++  java
  • 装饰器模式

    装饰器模式

    创建一个装饰类,用来包装原有的类,在保证不改变其结构完整的情况下,提供额外的功能。

    介绍

    意图:动态的为类增加新的功能。

    使用场景:在不想增加许多子类的情况下扩展类。

    关键代码

    • Component类充当抽象角色,不应该是具体实现。
    • 修饰类引用和继承Component类,具体扩展类重写父类方法。

    优点:装饰类和被装饰类相互独立,不会相互耦合,是继承的一个替代模式,动态的对类的功能进行扩展,更加的灵活。

    缺点:多层装饰比较复杂

    使用:

    // 接口
    /**
     * 英雄接口
     * @author 98543
     */
    public interface Hero {
    	
    	public void learnSkill();
    
    }
    
    // 被修饰类
    /**
     * 具体英雄
     * @author 98543
     */
    public class BlindMonk implements Hero{
    	
    	protected String name;
    	
    	public BlindMonk(String name) {
    		this.name = name;
    	}
    	
    	@Override
    	public void learnSkill() {
    		System.out.println(name+"学习了以上技能");
    	}
    
    }
    
    // 抽象修饰器
    /**
     * 抽象修饰类
     * @author 98543
     */
    public abstract class DecoratorComponent implements Hero{
    	
    	private Hero hero;
    	
    	public DecoratorComponent(Hero hero) {
    		this.hero = hero;
    	}
    	
    	@Override
    	public void learnSkill() {
    		if (hero != null) 
    			hero.learnSkill();
    	}
    
    }
    
    // 修饰器
    public class LearnSkill_Q extends DecoratorComponent{
    	
    	private String skillName;
    	
    	public LearnSkill_Q(Hero hero,String skillName) {
    		super(hero);
    		this.skillName = skillName;
    	}
    	
    	public void learnSkill() {
    		System.out.println("学习了技能->"+skillName);
    		super.learnSkill();
    	}
    }
    public class LearnSkill_W extends DecoratorComponent{
    	
    	private String skillName;
    	
    	public LearnSkill_W(Hero hero,String skillName) {
    		super(hero);
    		this.skillName = skillName;
    	}
    	
    	public void learnSkill() {
    		System.out.println("学习了技能->"+skillName);
    		super.learnSkill();
    	}
    
    }
    public class LearnSkill_E extends DecoratorComponent{
    
    	private String skillName;
    	
    	public LearnSkill_E(Hero hero,String skillName) {
    		super(hero);
    		this.skillName = skillName;
    	}
    	
    	public void learnSkill() {
    		System.out.println("学习了技能->"+skillName);
    		super.learnSkill();
    	}
    }
    /**
     * 具体修饰类
     * @author 98543
     */
    public class LearnSkill_R extends DecoratorComponent{
    	
    	private String skillName;
    	
    	public LearnSkill_R(Hero hero,String skillName) {
    		super(hero);
    		this.skillName = skillName;
    	}
    	
    	public void learnSkill() {
    		System.out.println("学习了技能->"+skillName);
    		super.learnSkill();
    	}
    
    }
    
    // 测试代码
    public class DecoratorPatternTest {
    	
    	public static void main(String[] args) {
    		Hero hero = new BlindMonk("李青");
    		LearnSkill_R r = new LearnSkill_R(hero, "猛龙摆尾");
    		LearnSkill_E e = new LearnSkill_E(r, "天雷破/摧筋断骨");
    		LearnSkill_W w = new LearnSkill_W(e, "金钟罩/铁布衫");
    		LearnSkill_Q q = new LearnSkill_Q(w, "天音波/回音击");
    		q.learnSkill();
    	}
    
    }
    
    // 输出
        学习了技能->天音波/回音击
        学习了技能->金钟罩/铁布衫
        学习了技能->天雷破/摧筋断骨
        学习了技能->猛龙摆尾
        李青学习了以上技能
    
  • 相关阅读:
    python3 基本使用多线程
    img前置显示屏装load图片
    leetcode
    亲串 (hdu 2203 KMP)
    基于VC面部识别软件(识别出人脸特征)
    IT该忍者神龟Oracle 树操作(select…start with…connect by…prior)
    It's about trust
    hdu 2128 Frog(简单DP)
    第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人
    Mac OS X通过结合80port
  • 原文地址:https://www.cnblogs.com/kungFuPander/p/11468364.html
Copyright © 2011-2022 走看看