Java设计模式之装饰模式是什么及怎么实现

Java设计模式之装饰模式是什么及怎么实现

1.什么是装饰模式

当我们想要改进或增强某个对象的功能,而又不想继承该类创建子类,可以考虑使用装饰模式。

使用装饰模式增强对象的某个功能,比生成子类再增强,更为灵活。

2.如何实现

1)抽象组件:定义一个抽象类,该抽象类定义了“被装饰者”需要被“装饰的方法”

2)具体组件:抽象组件的一个子类。成为“被装饰类”

3)装饰组件:也是抽象组件的一个子类。该类中持有“被装饰者”的引用,用来调用被装饰者的方法。可以为抽象类,也可以是非抽象类。

4)具体装饰类:是装饰组件的一个子类,被称为“装饰者”

3.代码实现

1)抽象组件

/** * 抽象组件,定义了被装饰类需要装饰的方法 */public abstract class ICake {    /**     * 需要装饰的方法     * @return     */    public abstract int getPrice();}

2)被装饰者

/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */public class Cake extends ICake {    /**     * 被装饰类中,装饰方法的基本实现     * @return     */    @Override    public int getPrice() {        System.out.println("getPrice");       return 100;    }}

3)装饰类

/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */public abstract class CakeDecorator extends ICake {    /**     * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。     */    ICake cake;    public CakeDecorator(ICake cake){        this.cake = cake;    }}

4)具体装饰

/** * 具体装饰类 */public class BlueBerryCake extends CakeDecorator {    public BlueBerryCake(ICake cake) {        super(cake);    }    /**     * 被装饰的方法     * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法     * @return     */    @Override    public float getPrice(){        return cake.getPrice()+elsePrice();    }    /**     * 增强的方法     * @return     */    private float elsePrice(){        System.out.println("else getPrice");        return 50;    }}

5)测试类

public class TestDecorator {    public static void main(String args[]){        ICake cake = new Cake();        CakeDecorator decorater = new BlueBerryCake(cake);        float price = decorater.getPrice();        System.out.println(price);    }}

4.拓展

1)利用子类继承也能实现某个方法的增强。相比通过装饰模式实现,装饰模式有和优势?

被装饰者和装饰者是松耦合关系。装饰类仅仅依赖于抽象组件,装饰类只需要知道被装饰类是抽象组件的一个子类,而不必知道具体是哪个子类。

装饰模式满足“开-闭原则”,不必修改具体组件,就可以增加针对该组件的装饰类。

5.JavaIo与装饰模式

java.IO包中的很多类使用了装饰模式。

Reader

FileReader

BufferdReader

以上就是关于“Java设计模式之装饰模式是什么及怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

文章标题:Java设计模式之装饰模式是什么及怎么实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21234

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部