Java设计模式:装饰模式以赋予普通人多种能人成为超人为例

//抽象超人,具备的技能。
public interface Superman {
    //技能
    void haveSkill();
}

 

/**
 * 该普通人将是被装饰的目标对象。
 * 最终将赋予全能,成为超人。
 */
public class Human implements Superman {
    @Override
    public void haveSkill() {
        System.out.println("普通人,没特殊能力");
    }
}

 

/**
 * 能力装饰类,把传入到当前的Superman进行装饰。
 *
 */
public abstract class Enhance implements Superman {
    private Superman superman;

    public Enhance(Superman s) {
        this.superman = s;
    }

    @Override
    public void haveSkill() {
        superman.haveSkill();
    }
}

 

/**
 * 鸟,飞行能力。
 */
public class Bird extends Enhance {
    public Bird(Superman superman) {
        super(superman);
    }

    @Override
    public void haveSkill() {
        super.haveSkill();

        canFly();
    }

    private void canFly() {
        System.out.println("鸟的飞行能力");
    }
}

 

/**
 * 鱼,游泳能力
 */
public class Fish extends Enhance{
    public Fish(Superman superman) {
        super(superman);
    }

    @Override
    public void haveSkill() {
        super.haveSkill();

        canSwim();
    }

    private void canSwim(){
        System.out.println("鱼的游泳能力");
    }
}

 

/**
 * 蜘蛛,攀爬能力。
 */
public class Spider extends Enhance {
    public Spider(Superman superman) {
        super(superman);
    }

    @Override
    public void haveSkill() {
        super.haveSkill();

        canClimb();
    }

    private void canClimb(){
        System.out.println("蜘蛛的攀爬能力");
    }
}

 

测试:

    private void test() {
        //普通人。
        Human human = new Human();

        //开始对普通人Human进行装饰。赋予各项能力。
        Superman superman = new Fish(new Spider(new Bird(human)));

        //装饰后形成超人能力。
        superman.haveSkill();
    }

 

输出:

普通人,没特殊能力
鸟的飞行能力
蜘蛛的攀爬能力
鱼的游泳能力

 

你可能感兴趣的:(Java,设计模式)