摘要:
概述 以微信聊天为例,可以用户与用户直接聊天,也可以通过微信群聊天。前者的话,用户要和别的用户加为好友,即用户和用户之间存在多对多关系,一个用户如果要将相同的信息发送给所有其他用户,必须一个一个发送。而如果使用群聊天,一个用户可以向多个用户发送相同信息而无须一一进行发送,只需将信息发送到群中即可,群 阅读全文
摘要:
概述 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不暴露它的内部结构。此外,针对不同的需要,可能还要以不同方式遍历整个聚合对象,但是我们不希望在聚合对象中充斥着各种不同遍历的操作。怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能 阅读全文
摘要:
概述 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子。再构建一个解释器,解释器通过解释这些句子来解决对应的问题。 举个例子,我们希望系统提供一个功能来支持一种新的加减法表达式语言,当输入表达式为 "1 + 2 + 3 - 4 + 1" 时,输出计算结 阅读全文
摘要:
概述 举个现实生活中的例子,开关是请求的发送者,电灯是请求的接收者,它们之间不存在直接的耦合关系,而是通过电线连接到一起,开关不需要知道如何将开灯或关灯请求传输给电灯,而是通过电线来完成这项功能。 可以理解为电线充当封装请求的命令对象,开关如果开则电线通电,并调用电灯的开灯方法,反之则关灯。不同电线 阅读全文
摘要:
概述 很多情况下,可以处理某个请求的对象不止一个,如大学里的奖学金审批,学生先向辅导员提交审批表,辅导员签字审批后再交给系主任签字审批,接着是院长审批,最后可能是校长审批,在这个过程中,奖学金申请表可以看作一个请求对象,不同级别审批者都可以处理该请求,除了辅导员之外,学生不需一一和其他审批者交互,只 阅读全文
摘要:
概述 某些情况下,一个客户不想或不能直接引用一个对象,此时可以通过代理对象实现间接引用,通过代理对象去掉客户不能看到的内容和添加客户需要的额外服务 模式实例 在一个论坛已注册用户和游客权限不同,已注册用户拥有发帖、修改注册信息、修改自己帖子等功能;而游客只能看到别人发的贴子,没有其他权限。本实例中我 阅读全文
摘要:
概述 有时候需要在系统中增加对象的个数,并且这些对象是相同或相似的。为了避免出现大量相同或相似的对象,享元模式通过共享技术实现相同或相似对象的重用,享元模式通常会出现工厂模式,需要创建一个享元工厂来维护一个享元池,用于存储具有相同或相似的享元对象 模式分析 享元模式的核心在于享元工厂类,享元工厂类的 阅读全文
摘要:
概述 在大多数情况下,网站都会提供一个网站首页作为入口,提供通往各个子栏目的超链接。用户只需记住网站首页网站 URL,而无须记住每个子栏目的网址 同理,用户与系统的交互可以通过一个外观对象进行,提供实现各种功能的子系统接口 模式实例 一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动 阅读全文
摘要:
概述 装饰模式可以在不改变一个对象本身的基础上给对象增加额外的新行为,如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有防潮功能,用户可以根据需要增加不同类型的相框 在开发中,可以通过继承使子类为父类方法添加功能,但这种方式是静态的,用户不能控制增加行为的方式和时机。 装饰模式将一个对象嵌 阅读全文
摘要:
概述 一个容器对象下拥有多个叶子对象,类似树形结构 模式实例 定义一个抽象类,它既可以代表叶子,也可以代表容器 public abstract class Component { public abstract void add(Component c); public abstract void 阅读全文