
结构型模式
文章平均质量分 70
weixin_46722612
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
结构型模式——代理
代理模式,即Proxy,它和Adapter模式很类似。我们先回顾Adapter模式,它用于把A接口转换为B接口:public BAdapter implements B { private A a; public BAdapter(A a) { this.a = a; } public void b() { a.a(); }}而Proxy模式不是把A接口转换成B接口,它还是转换成A接口:public AProxy imple.原创 2021-03-23 10:49:05 · 74 阅读 · 0 评论 -
结构型模式——享元
享元(Flyweight)的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。享元模式在Java标准库中有很多应用。我们知道,包装类型如Byte、Integer都是不变类,因此,反复创建同一个值相同的包装类型是没有必要的。以Integer为例,如果我们通过Integer.valueOf()这个静态工厂方法创建Integer实例,当传入的int范围在-128~+127之间时,会直接.原创 2021-03-23 09:50:35 · 86 阅读 · 0 评论 -
结构型模式——外观
外观模式,即Facade,是一个比较简单的模式。它的基本思想如下:如果客户端要跟许多子系统打交道,那么客户端需要了解各个子系统的接口,比较麻烦。如果有一个统一的“中介”,让客户端只跟中介打交道,中介再去跟各个子系统打交道,对客户端来说就比较简单。所以Facade就相当于搞了一个中介。我们以注册公司为例,假设注册公司需要三步:向工商局申请公司营业执照;在银行开设账户;在税务局开设纳税号。以下是三个系统的接口:// 工商注册:public class AdminOfIndustry {原创 2021-03-23 09:37:49 · 217 阅读 · 0 评论 -
结构型模式——装饰器
装饰器(Decorator)模式,是一种在运行期动态给某个对象的实例增加功能的方法。我们在IO的Filter模式一节中其实已经讲过装饰器模式了。在Java标准库中,InputStream是抽象类,FileInputStream、ServletInputStream、Socket.getInputStream()这些InputStream都是最终数据源。现在,如果要给不同的最终数据源增加缓冲功能、计算签名功能、加密解密功能,那么,3个最终数据源、3种功能一共需要9个子类。如果继续增加最终数据源,或者增加.原创 2021-03-23 09:05:33 · 105 阅读 · 0 评论 -
结构型模式——组合
组合模式(Composite)经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。我们来看一个具体的例子。在XML或HTML中,从根节点开始,每个节点都可能包含任意个其他节点,这些层层嵌套的节点就构成了一颗树。要以树的结构表示XML,我们可以先抽象出节点类型Node:public interface Node { // 添加一个节点为子节点: Node add(Node node); // 获取子节点: List<N.原创 2021-03-23 08:33:24 · 88 阅读 · 0 评论 -
结构型模式——桥接
桥接模式的定义非常玄乎,直接理解不太容易,所以我们还是举例子。假设某个汽车厂商生产三种品牌的汽车:Big、Tiny和Boss,每种品牌又可以选择燃油、纯电和混合动力。如果用传统的继承来表示各个最终车型,一共有3个抽象类加9个最终子类:如果要新增一个品牌,或者加一个新的引擎(比如核动力),那么子类的数量增长更快。所以,桥接模式就是为了避免直接继承带来的子类爆炸。我们来看看桥接模式如何解决上述问题。在桥接模式中,首先把Car按品牌进行子类化,但是,每个品牌选择什么发动机,不再使用子类扩充,而是通过.原创 2021-03-23 08:33:08 · 104 阅读 · 0 评论 -
结构型模式——适配器
适配器模式是Adapter,也称Wrapper,是指如果一个接口需要B接口,但是待传入的对象却是A接口,怎么办?我们举个例子。如果去美国,我们随身带的电器是无法直接使用的,因为美国的插座标准和中国不同,所以,我们需要一个适配器。在程序设计中,适配器也是类似的。我们已经有一个Task类,实现了Callable接口:public class Task implements Callable<Long> { private long num; public Task(long .原创 2021-03-23 08:32:55 · 119 阅读 · 0 评论