装饰模式与职责链模式笔记

news2024/11/24 6:27:15

装饰模式(Decorator)

  1. 概念
    动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  2. UML类图:
    在这里插入图片描述
  3. 代码
    给人打扮
//人类(ConcreteComponent)
public class Person {
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public void show() {
        System.out.println("装扮的" + name);
    }

}
//服饰类(Decorator)
public class Finery extends Person{
    protected Person component;
    //打扮
    public void Decorate(Person component){
        this.component = component;
    }

    @Override
    public void show(){
        if (component != null){
            component.show();
        }
    }
}

//具体服装类(concreteDecorator)
class LeatherShoes extends Finery {
    @Override
    public void show() {
        System.out.print("皮鞋");
        super.show();
    }
}

//具体服装类(concreteDecorator)
class TShirts extends Finery{
    @Override
    public void show() {
        System.out.print("T恤");
        super.show();
    }
}

//具体服装类(concreteDecorator)
class Suit extends Finery{
    @Override
    public void show() {
        System.out.print("西装");
        super.show();
    }
}

//
class Demo{
    public static void main(String[] args) {
		Person person = new Person("查尔");
		
		LeatherShoes ls = new LeatherShoes();
        Suit suit = new Suit();
        TShirts ts = new TShirts();
        
		//装饰过程
		ls.Decorate(person);
        suit.Decorate(ls);
        ts.Decorate(suit);
        ts.show();
}
  1. 总结:
    • 对原始功能的扩展(增强)。
    • 每个具体装饰类只关心自己的功能,不关心如何被添加到对象链当中。让户用在客户端根据需要有选择、按顺序地使用,实现不同效果。
    • 把类中的装饰功能从类中去除,简化原有的类,让其符合单一职责。
    • 有效地把类的核心职责和装饰功能分开,还可去除相关类中重复的装饰逻辑

职责链模式

  1. 概念
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  2. UML类图:
    在这里插入图片描述
  3. 代码
//请求
public class Request {
    private String requestType;//申请类别
    private String requestContent;//内容
    private int number;//数量

    public String getRequestType() {
        return requestType;
    }
    
    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public String getRequestContent() {
        return requestContent;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

//Handler类
abstract class Manager {
    protected String name;
    //管理者的上级
    protected Manager superior;

    public Manager(String name){
        this.name = name;
    }
    //设置管理者的上级
    public void setSuperior(Manager superior){
        this.superior=superior;
    }
    //申请请求
    abstract public void RequestApplications(Request request);
}

//ConcreteHandler类,经理
class CommonManager extends Manager {

    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void RequestApplications(Request request) {
        if ("请假".equals(request.getRequestType()) && request.getNumber() <= 2) {
            System.out.println(name + ":" + request.getRequestContent() + "数量" + request.getNumber() + "被比准");
        } else if (superior != null) {
            superior.RequestApplications(request);
        }
    }
}

/**
 * ConcreteHandler类,总监
 */
class Majordomo extends Manager {

    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void RequestApplications(Request request) {
        if ( "请假".equals(request.getRequestType()) && request.getNumber() <= 5) {
            System.out.println(name + ":" + request.getRequestContent() + "数量" + request.getNumber() + "被比准");
        } else if (superior != null) {
            superior.RequestApplications(request);
        }
    }
}

/**
 * ConcreteHandler类,总经理
 */
class GeneralManger extends Manager {

    public GeneralManger(String name) {
        super(name);
    }

    @Override
    public void RequestApplications(Request request) {
        if ( "请假".equals(request.getRequestType())) {
            System.out.println(name + ":" + request.getRequestContent() + "数量" + request.getNumber() + "被比准");
        } else if ( "加薪".equals(request.getRequestType()) && request.getNumber() == 500) {
            System.out.println(name + ":" + request.getRequestContent() + "数量" + request.getNumber() + "被比准");
        } else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500) {
            System.out.println(name + ":" + request.getRequestContent() + "数量" + request.getNumber() + "再说吧");
        }
    }
}


public class Demo {
    public static void main(String[] args) {
        CommonManager difan = new CommonManager("笛梵");
        Majordomo huashuo = new Majordomo("华硕");
        GeneralManger jinhuan = new GeneralManger("金换");
        //设置职责链的上家和下家
        difan.setSuperior(huashuo);
        huashuo.setSuperior(jinhuan);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("小白请假");
        request.setNumber(3);
        difan.RequestApplications(request);

        Request request1 = new Request();
        request1.setRequestType("加薪");
        request1.setRequestContent("小白请求加薪");
        request1.setNumber(500);
        difan.RequestApplications(request1);
    }
}
  1. 总结:
    • 降低接受者与发送者耦合度; 一个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,客户端只需要发起一次调用即可。
    • 核心思想就是分而治之。每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,把它们组织起来,形成一个链式的结构。
    • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
    • 使用职责链要保证每个请求一定被处理。如果一个请求一直传到链的末端都得不到处理,这就槽糕了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计ssm实验教学资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C语言笔记第03章:数组

了解更多关注中南林业科技大学软件协会官网&#xff1a;https://www.csuftsap.cn/ 来自软件协会编辑&#xff0c;注册会员即可获取全部开源.md资源&#xff0c;请勿转载&#xff0c;归软件协会所有。 任何问题联系软件协会。 文章目录:star: 数组1.八个老婆引出数组 - 为什么…

1.7.2、计算机网络体系结构分层的必要性

1.7.2、计算机网络体系结构分层的必要性 计算机网络是个非常复杂的系统\color{red}计算机网络是个非常复杂的系统计算机网络是个非常复杂的系统。早在最初的ARPANET设计时就提出了分层的设计理念。 "分层\color{red}分层分层"可将庞大而复杂的问题&#xff0c;转化为…

一专多能、创新力十足,南大通用GBase8c数据库获鲲鹏创新应用大赛金奖

被评为openGauss赛道金奖的多模多态分布式数据库GBase 8c其含金量表现在哪些方面&#xff1f;基于openGauss有哪些技术创新&#xff1f; 其商业价值是什么&#xff1f;在哪些场景发挥作用&#xff1f; 面向全球开发者的年度顶级赛事——鲲鹏应用创新大赛已经举办三个年头了。三…

DHCP协议从入门到部署DHCP服务器进行实验

目录 1、DHCP基本概念 2、DHCP的优点 3、DHCP的工作原理 4、通过抓包验证原理 5、在windows server上部署DHCP服务器 6、实验搭建 实验环境 配置R1的中继 常见报文学习 1、DHCP基本概念 路由器可以阻挡DHCP discover的广播报文 2、DHCP的优点 3、DHCP的工作原理 4、通过抓…

Java笔试复盘

目录 1. finalize的含义 2.Statement和PreparedStatement用法 3. 接口能用protected修饰吗 4.java实现分解质因数 今天去参加了一场国企单位的笔试&#xff0c;很基础&#xff0c;但是有些细节的地方还是觉得答得不好&#xff0c;所以复盘一下。 1. finalize的含义 final…

WPF几何绘图(2)

Path的各种线段&#xff1a; LineSegment 直线段。 ArcSegment 圆弧线段。 BezierSegment 三次贝塞尔曲线段&#xff08;默认贝斯尔曲线是指三次曲线&#xff09;。 QuadraticBezierSegment 二次贝塞尔曲线段。 PolyLineSegment 多直线段。 PolyBezierSegment 多三次方贝塞…

一篇博文,带你入门数据库SQL语言

目录 &#x1f4d6;前言 &#x1f388;SQL的分类 &#x1f3a8;数据库的分类 ✨SQL的基础操作 ⚽SQL常用数据类型 &#x1f3c9;数据库的操作 ⚾创建数据库 &#x1f94e;显示数据库 &#x1f3c0;使用数据库 &#x1f3d0;删除数据库 &#x1f37f;表的操作 &…

Emgu CV4图像处理之打开Tensorflow训练模型17(C#)

本文测试环境&#xff1a; win10 64位 vistual studio 2019 Emgu CV 4.6.0 环境配置准备&#xff1a; 1 新增控制台项目&#xff0c;.net framework为4.7.2 2 把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下 3 项目选择x64 4 添加项目引用…

(CVE-2019-0227)Axis<=1.4 远程命令执行漏洞

结尾附上本文的环境和PoC 一、漏洞介绍 漏洞本质是管理员对AdminService的配置错误。当enableRemoteAdmin属性设置为true时&#xff0c;攻击者可以构造WebService调用freemarker组件中的template.utility.Execute类&#xff0c;远程利用AdminService接口进行WebService发布&am…

Linux_gdb_进程概念

目录 进度条 学习过程 自主实现&#xff1a; Linux的git操作 .gitignore .git git add . git commit git push git log git status git pull 进度条 学习过程 首先创建源文件&#xff0c;这个源文件就是我们要写的进度条的定义 接下来&#xff0c;我们创建文件Ma…

化工行业供应商协同管理系统:助力企业打造良好营商环境,提升运营效率

化工行业是我国工业发展的重要基础&#xff0c;也是国民经济发展和生活不可或缺的一部分。化工产品的更新换代&#xff0c;产业的不断升级&#xff0c;对原材料的采购也提出了更高要求。 由于精细化工行业原材料的质量和成本&#xff0c;与供应商的选择与资质具有重要的关联性…

[附源码]计算机毕业设计JAVAjsp医院网上预约系统

[附源码]计算机毕业设计JAVAjsp医院网上预约系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myb…

关于Python和自动化

最近碰到了好几次面试都需要问Python。 在这里我有一个误区&#xff0c;向各位面试官先陈述一下。 之前的时候&#xff0c;对C和C研究的更加多一点&#xff0c;再加上多年的自动化维护经验&#xff0c;自认为对po封装模式的理解&#xff0c;因此对于自认为对Python是十拿九稳&a…

[Spring MVC6]事务管理与缓存机制

Spring MVC 关于Spring与MaBatis事务管理&#xff0c;这里的事务管理类似于数据库中的transaction,基本操作也都一样。同时介绍了MaBatis缓存模式&#xff0c;特别是一级缓存与二级缓存。 希望对你有所帮助&#xff01; 目录Spring 事务管理MyBatis 事务管理MyBatis 缓存模式一…

html实现个人空间主页(附源码)

文章目录1.设计思路1.1 欢迎界面1.2 屏保界面1.3 主界面1.4 我的项目界面1.5 我的日记界面1.6 我的日记管理界面2.效果展示和代码展示2.1 动态效果图2.2 主界面代码2.3 欢迎页代码2.4 屏保代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weix…

JavaScript算法 — 二叉树遍历

目录1、构造二叉树2、递归遍历3、非递归遍历3.1 先序3.2 中序3.3 后序1、构造二叉树 树节点&#xff1a; // 二叉树节点的构造函数 function TreeNode(val, left, right) {this.val (valundefined ? 0 : val)this.left (leftundefined ? null : left)this.right (rightu…

给好朋友用代码画一个爱心吧

目录 效果图 html爱心 python爱心 ​编辑 代码 html python 浅浅分析一下《燃烧我&#xff0c;照亮你》剧中的爱心代码 光棍节要到了&#xff0c;不给心意的人写个爱心代码&#xff1f; 话不多说&#xff0c;上才艺&#xff0c;这里有两种爱心&#xff0c;一种是html&a…

Unity功能—— 在VS中快速访问Unity API对应文档

声明&#xff1a;本文为个人笔记&#xff0c;用于学习研究使用非商用&#xff0c;内容为个人研究及综合整理所得&#xff0c;若有违规&#xff0c;请联系&#xff0c;违规必改。 Unity功能—— 在VS中快速访问Unity API对应文档 文章目录Unity功能—— 在VS中快速访问Unity API…

光点科技数据口袋数据填报系统满足多类型企业报表需求_光点科技

在招聘过程中&#xff0c;HR对数据处理存在一定的需求&#xff0c;手动整理繁杂的数据无疑是加大招聘工作量&#xff0c;因此&#xff0c;借助数据填报系统更好地进行处理数据工作&#xff0c;不失为帮助HR减轻招聘工作量的良方。 光点数据填报系统利用传统商业报表工具进行数据…