最新文章
2024年 9月 11日
我们已学完了三类设计模式类型中的两类:结构类型、行为类型,这一篇开始学习最后一类:创建类型。创建类型的设计模式都是关于创建对象的。 首先是原型模式(Prototype Pattern),当我们通过复制已存在的对象(原型)来创建新对象时,可以使用该模式。 问题提出 来看实际场景。 打开Mac系统的Keynote应用,它类似于Windows下的PowerPoint,在画板里,选择并绘制某个形状比如圆形,然后右键点击该圆形弹出菜单,选择“复制”,将生成一个同样的圆形。...
2024年 9月 9日
代理模式(Proxy Pattern)允许我们为真实对象创建代理,如果您想与某个对象对话,将通过其代理与其对话,此代理程序接收您的消息并将其转发给目标对象。 它有什么好处?允许我们在将消息发送至目标对象前执行一些感兴趣的任务,例如日志、权限控制、缓存等。 问题提出 假设我们要构建一个电子书阅读程序,它有一个图书库,我们购买的所有的电子书均在此图书库中。 创建Ebook类,它有私有属性fileName,私有方法load用于加载书的内容,在构造函数中调用load方法初始化加载书的内容。show方法用于显示书的内容。getFileName方法用于获取书名。...
2024年 8月 30日
桥接模式(Bridge Pattern)可以构建独立增长的灵活层次结构,使其更加可扩展和可维护。 问题提出 假设我们构建一个通用的遥控器APP,用于控制各种品牌的电视机。 遥控器有不同类型,比如:基本型RemoteControl、高级型AdvancedRemoteControl、影片型MovieRemoteControl等。基本型有turnOn和turnOff方法,高级型有setChannel方法,影片型有play、pause、rewind等方法。这些方法目前是没法知道如何工作的,只有到设计具体的电视机时才知道,所以这些方法是抽象(abstract)方法,相应地,类也是抽象类。...
2024年 8月 25日
应用程序的对象占用大量内存,使用享元模式(Flyweight Pattern)可以减少内存消耗。 问题提出 假设我们要构建一个类似 谷歌地图 的移动应用程序,我们要渲染显示各种兴趣点,例如咖啡馆、餐馆、医院、学校等。 兴趣点有坐标(x, y)、类型(咖啡馆、餐馆等)、图标等属性。 我们用代码尝试实现。 创建enum枚举PointType,列出相关类型。 创建类Point,它有属性x, y,...
2024年 8月 23日
外观模式(Facade Pattern)可以为复杂系统提供简单的接口。 问题提出 想象我们要创建一个手机APP,其中有一个功能是向用户推送消息。 作为极简的框架,我们有一个消息Message类承载消息内容,以及消息服务类NotificationServer 处理连接服务器、验证用户、发送消息、断开连接等任务。 根据这个框架,我们来完善下。 创建Connection类,它有disconnect方法。...
2024年 8月 18日
装饰者模式(Decorator Pattern)用于向对象添加附加的功能。 问题提出 假设你加入了一家提供云主机服务的公司,你的工作是设计类实现将数据存储到云端。 创建类CloudStream,它有write方法。 明天,我们需要在将敏感数据比如信用卡数据存入云端前进行加密。 我们不想修改通用的CloudStream类,因为加密数据只在特定的场合下才需要,正常情况下CloudStream工作得很好。我们如何处理这个问题?...
2024年 7月 28日
适配器模式(Adapter Pattern)用于将类的接口转换成不同的形式。 问题提出 假设我们要创建一个移动应用程序,它用于给拍的照片或加载的图片应用各种各样的滤镜。 创建类Image。 创建接口Filter,并定义apply方法。 创建VividFilter类,实现Filter接口。 接着,创建类ImageView,它有image属性和apply方法。 然后在main中创建ImageView对象,并应用VividFilter滤镜。...
2024年 7月 26日
我们已学习了设计模式的行为类型,从这一篇开始学习设计模式的结构类型,即关于对象之间关系的设计模式。 第一篇我们学习复合模式(Composite Pattern),在需要表示和操作对象层次结构的情况下使用此模式。 问题提出 看一下苹果电脑Mac下的KeyNote应用,它类似微软的PowerPoint。 我们将两个矩形组成一组,两个圆形也组成一组。 我们移动组,组内的对象全部一起移动,调整组的大小,组内的对象也全部进行调整。我们像处理单独的对象一样来处理组。...
2024年 7月 13日
访问者模式(visitor pattern)允许我们在不修改对象结构的情况下向其添加新操作。 问题提出 假设我们创建一个HTML编辑器。 HTML是由各个节点组成,比如h1, a 等。 创建接口HtmlNode用于表示各节点共同的特性。假设我们希望高亮显示各节点标记,HtmlNode接口定义了highlight()方法。 创建类HeadingNode和类AnchorNode,实现了HtmlNode接口。...
2024年 7月 3日
责任链模式(chain of responsibility pattern)用于对请求对象进行流水线的处理。 问题提出 来看一实际的例子。 WEB服务器类WebServer,有一个方法handle。handle方法中,依次对Http请求进行身份验证authentication、记录日志logging、压缩compression等操作任务。 我们不想在handle方法中实现所有这些操作任务,因为这违反了单一职责原则,我们将每一个操作任务放在一个独立的类中。...
No posts found