设计模式------装饰者模式

本文详细介绍了装饰模式的概念及其应用,展示了如何在不增加子类的情况下扩展对象功能。通过具体案例,解释了装饰模式如何帮助程序员角色逐步增加技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 
2.装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。 
3.装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。

具体案列

本例中 抽象构建角色由Programmer程序员接口扮演
具体构件角色由类汤高扮演  他实现了程序员具有的功能
装饰构件由 类Derector扮演 它必须也实现抽象构件接口
具体装饰构件角色由 类Hacker(黑客) 和类 SoftwareAchitect(架构师)扮演
具体程序员汤高有编程能力,上帝可以给他赋予更多能力 每赋予一种能力,他就多一个技能 这是通过装饰构件实现的

抽象构件角色

/**
 * 抽象构件角色
 *  程序员接口   程序员具有编程的能力
 * @author Administrator
 *
 */
public interface Programmer {
    //编程
    public void programme();
}

具体构件角色

/**
 * 具体构件角色  
 *  汤高是一个具体的程序员  
 * 那么他就具有编程能力
 * @author Administrator
 *
 */
public class 汤高 implements Programmer {

    @Override
    public void programme() {
        System.out.println("我是一个程序员, 我能编程");
    }

}

装饰角色

/**
 * 装饰角色
 *  
 * @author Administrator
 *
 */
public class Derector implements Programmer{
    private Programmer programmer;

    public Derector(Programmer programmer) {
        this.programmer = programmer;
    }

    @Override
    public void programme() {
        programmer.programme();
        //附加的责任或者功能
    }
}

具体装饰角色1

/**
 *  具体装饰角色  
 *  黑客类   他具有附加的功能  他能入侵别人的电脑
 * @author Administrator
 *
 */
public class Hacker extends Derector {

    public Hacker(Programmer programmer) {
        super(programmer);
    }

    @Override
    public void programme() {
        super.programme();
        //附加的责任或者功能
        System.out.println("我具有黑客的技能   我能入侵别人的电脑");
    }

}

具体装饰角色2

/**
 *  具体装饰角色  
 *  软件架构师类   他具有附加的功能  能设计总个网站或系统的骨
 * @author Administrator
 *
 */
public class SoftwareArchitect extends Derector {

    public SoftwareArchitect(Programmer programmer) {
        super(programmer);
    }

    @Override
    public void programme() {
        super.programme();
        //附加的责任或者功能
        System.out.println("我具有架构师的技能  我能设计总个网站或系统的骨架");
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        //创建构件对象   汤高 ->他是一个具体的程序员 
        //但是现在他只有编程能力  那怎么行
        //必须赋予他更大的能力  不然怎么赚大钱!
        //所以 上帝给他装饰了一番  瞬间提神了他的B格
        Programmer programmer=new 汤高();

        //装饰类登场  屌丝  我来装饰你  让你具有更大的能力 
        Derector hacker=new Hacker(programmer);
        //这下汤高这个屌丝程序员就具有黑客的技能包了
        //这下就没有谁敢叫他屌丝了吧  哈哈  不然分分钟让你电脑崩溃
        System.out.println("第一次装饰");
        hacker.programme();

        //程序员还不满足  他还要更多的技能  因为他要逆袭
        //所以上帝再给他装饰了一下 
        //在他具有黑客技能的基础上另外赋予了他架构师的功能
        System.out.println("--------------第二次装饰");
        Derector  achitect=new SoftwareArchitect(hacker);

        achitect.programme();
        //也可以一步装饰两个技能 因为他们有共同的父类抽象构件接口 Programmer
        System.out.println("------------一步装饰两个技能");
        Derector achitect1=new SoftwareArchitect(   new  Hacker(new 汤高() ) );
        achitect1.programme();
    }

}

结果: 
第一次装饰 
我是一个程序员, 我能编程 
我具有黑客的技能 我能入侵别人的电脑 
————–第二次装饰 
我是一个程序员, 我能编程 
我具有黑客的技能 我能入侵别人的电脑 
我具有架构师的技能 我能设计总个网站或系统的骨架 
————一步装饰两个技能 
我是一个程序员, 我能编程 
我具有黑客的技能 我能入侵别人的电脑 
我具有架构师的技能 我能设计总个网站或系统的骨架


使用时只需要将需要的已有的功能(一个个继承了Derector的类)一个一个new进去即可

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值