GoF23种设计模式之结构型模式之装饰模式
一、概述
动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。
二、适用性
1.在不影响其他对象的情况下,以动态、透明的方式给但个对象添加职责。
2.处理那些可以撤销的职责。
3.当不能采用生成子类的方式进行扩展的时候。
三、参与者
1.Component:定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。
3.Decorator:维持一个指向Component对象的指针,并且定义一个与Component接口一致的接口。
4.ConcreteDecorator:向组件添加职责。
四、类图
五、示例
Component
- package cn.lynn.decorator;
- public interface IAnimal {
- public void eat();
- }
ConcreteComponent
- package cn.lynn.decorator;
- public class Dog implements IAnimal {
- @Override
- public void eat() {
- System.out.println("狗啃骨头!");
- }
- }
Decorator
- package cn.lynn.decorator;
- public abstract class Decorator implements IAnimal {
- private IAnimal animal;
- public void setAnimal(IAnimal animal) {
- this.animal = animal;
- }
- @Override
- public void eat() {
- animal.eat();
- }
- }
ConcreteDecorator
- package cn.lynn.decorator;
- public class DogDecoratorA extends Decorator {
- @Override
- public void eat() {
- super.eat();
- transform();
- }
- public void transform() {
- System.out.println("机器狗变形出发!");
- }
- }
- package cn.lynn.decorator;
- public class DogDecoratorB extends Decorator {
- @Override
- public void eat() {
- super.eat();
- say();
- }
- public void say() {
- System.out.println("旺旺!");
- }
- }
Client
- package cn.lynn.decorator;
- public class Client {
- public static void main(String[] args) {
- Dog dog = new Dog();
- DogDecoratorA dogDecoratorA = new DogDecoratorA();
- DogDecoratorB dogDecoratorB = new DogDecoratorB();
- dogDecoratorA.setAnimal(dog);
- dogDecoratorB.setAnimal(dogDecoratorA);
- dogDecoratorB.eat();
- }
- }
Result
- 狗啃骨头!
- 机器狗变形出发!
- 旺旺!
GoF23种设计模式之结构型模式之装饰模式的更多相关文章
- GoF23种设计模式之结构型模式之桥接模式
一.概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...
- GoF23种设计模式之结构型模式之组合模式
一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...
- GoF23种设计模式之结构型模式之外观模式
一.概述 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...
- GoF23种设计模式之结构型模式之代理模式
一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...
- GoF23种设计模式之结构型模式之享元模式
一.概述 运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...
- GoF23种设计模式之结构型模式之适配器模式
一.概述 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...
- Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- GoF的23种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
随机推荐
- hdu2027 trie树 字典树模板
#include <iostream> #include <cstdio> #include <cstring> #include <sstream> ...
- 对于es线程池使用的思考
es有内置的线程池 在实际项目中,发现 使用client框架关闭连接太慢(其实是把连接归还到池子里),采用异步关闭. 随着连接的关闭,计算机内存在不断下降 ------------------- ...
- js得到当前页面的url信息
所有的代码都是可用,而且附了图片的,不过是直接用我自己的文章地址,所以有些显示的有点奇怪. 大家可以找个网址试试代码是否可行. 1,设置或获取对象指定的文件名或路径. console.log(wind ...
- AJPFX关于JDK,JRE,JVM的区别与联系
很多朋友可能跟我一样,对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天我们来整理下三者的关系. JDK : Java Development ToolKit(Java开发工具包) ...
- text-transform字母大小写属性设置
text-transform: none: 默认 不设置,全是小写 capitalize: 每个单词以大写字母开头 uppercase: 全部是大写字母 lowercase: 全部是小写字母 in ...
- 《移动Web前端高效开发实战》笔记4--打造单页应用SPA
路由是一个单页应用的核心,大部分前端框架都实现了一个复杂的路由库,包括动态路由,路由钩子,组件生命周期甚至服务器端渲染等复杂的功能.但是对于前端开发者而言,路由组件的核心是URL路径到函数的映射,了解 ...
- css3动画之圆形运动轨迹
css3中通过@keyframes定义动画,animation设置动画属性,从而实现动画效果: 在animation属性当中,可以规定动画的名称.整个动画的运行时间.运动的速度曲线以及其延迟时间.播放 ...
- SharePoint 2013 缺少站点保存为模板选项
如果您尝试在SharePoint Server 2013中保存站点,我们没有看到“将站点另存为模板”选项,则可能是因为该站点已启用站点发布功能.如 之前文章提到 “SharePoint 2010 缺少 ...
- SqlServer 填充因子的说明
CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfactor=30 使用 fill factor 选项可以指定 M ...
- (转载)资源字典(Pro WPF 学习)
原地址:http://www.cnblogs.com/yxhq/archive/2012/07/09/2582508.html 1.创建资源字典 下面是一个资源字典(AppBrushes.xaml), ...