首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 装饰模式 (Decorator)「建议收藏」

Java 装饰模式 (Decorator)「建议收藏」

作者头像
全栈程序员站长
发布2022-07-10 14:22:43
发布2022-07-10 14:22:43
3900
举报

大家好,又见面了,我是全栈君。

装饰模式

动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的取代方案

代码

代码语言:javascript
复制
package gx.component;

/** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 * @author always * */
public abstract class Component {

    public abstract void description();
    public abstract int cost();
}
代码语言:javascript
复制
package gx.component.impl;

import gx.component.Component;


/** * 装饰类的抽象类 * @author always * */
public abstract class Decorator extends Component{

    protected Component component;
}
代码语言:javascript
复制
package gx.component.impl;

import gx.component.Component;

/** * * 被包装的类 * @author always * */
public class Phone extends Component{

    public void description() {
        System.out.println("裸机");
    }

    public int cost() {

        return 1900;
    }


}
代码语言:javascript
复制
package gx.decorator.impl;

import gx.component.Component;
import gx.component.impl.Decorator;

/** * * 装饰1:给手机买个壳 * @author always * */
public class DaiKe extends Decorator{

    public DaiKe(){

    }

    public DaiKe(Component component){
        this.component=component;
    }
    public void description() {
        this.component.description();
        System.out.println("带了手机壳");
    }

    public int cost() {
        return 50+this.component.cost();
    }

}
代码语言:javascript
复制
package gx.decorator.impl;

import gx.component.Component;
import gx.component.impl.Decorator;

/** * * 装饰2:给手机贴个膜 * @author always * */
public class TieMo extends Decorator{

    public TieMo(){}

    public TieMo(Component component){
        this.component=component;
    }

    public void description() {
        this.component.description();
        System.out.println("贴了膜");
    }

    public int cost() {
        return 20+this.component.cost();
    }

}

測试类:

代码语言:javascript
复制
package gx;

import gx.component.Component;
import gx.component.impl.Phone;
import gx.decorator.impl.DaiKe;
import gx.decorator.impl.TieMo;
import junit.framework.TestCase;

public class TestDecorator extends TestCase {

    public void testDecorator() {

        Component component = new TieMo(new DaiKe(new Phone()));

        component.description();
        System.out.println("价钱:" + component.cost());
        /* * 结果: * 裸机 * 带了手机壳 * 贴了膜 * 价钱:1970 */
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115420.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月4,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 装饰模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档