Java设计模式 - 装饰器模式

 装饰器模式

装饰器模式就是在不改变原来设计的同时,动态的给对象添加一些额外的功能(加强原来的功能/拓展原来对象没有的功能)。

UML图示

装饰器模式中的角色

抽象组件(Component):抽象类,规定了被装饰者需要进行修饰的方法。

具体组件(ComponentImpl):类,本类的实例被称为‘被装饰者’。

装饰(Decorator): 类,继承并拥有抽象组件(子)类的实例对象。

具体装饰(DecoratorImpl): 类,该类的实例被称为‘装饰者’。

 

装饰器模式举例

普通的鸟可以飞行10km,但现在有一种加强型的鸟可以飞行15km,另外还有一中可以飞行20km的鸟。使用装饰器模式来完成设计。

 - Bird.java

public abstract class Bird {

    public abstract int fly();

}

- NormalBird.java 

public class NormalBird extends Bird {

    private static final int DISTANCE = 50;

    public int fly(){
       return DISTANCE;
    }
}

- BirdEnhance.java 

public abstract class BirdEnhance extends Bird {

    protected Bird bird;

    BirdEnhance(){
    }

    BirdEnhance(Bird bird){
        this.bird = bird;
    }
}

 - EnhancedBird.java

public class EnhancedBird extends BirdEnhance {
    private final int DISTANCE = 10;

    EnhancedBird(Bird bird){
        super(bird);
    }

    public int fly(){
        int distance = 0;
        distance = bird.fly()+eleFly();
        return distance;
    }

    private int eleFly(){
        return DISTANCE;
    }

}

- Application.java 

public class Application {

    public static void main(String[] args){
        //make normal bird
        Bird bird1 = new NormalBird();
        System.out.println(bird1.fly());

        //make bird which can fly 60km.
        BirdEnhance enhanceBird = new EnhancedBird(bird1);
        System.out.println(enhanceBird.fly());

        //make bird which can fly 70km.
        BirdEnhance enhancedBird = new EnhancedBird(enhanceBird);
        System.out.println(enhancedBird.fly());
    }
}

装饰器模式的特点/优点

装饰器类同时继承并引用抽象组件,可以同时存放装饰者与被装饰者的引用。

同时由于可以引用被装饰者的实例,所以无需重写原来的装饰方法。类似于写了一个工具方法。

可以完成类似于迭代调用的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值