10 浅谈 装饰器模式的理解与使用

在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式

所属与结构型模式,

这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能。

为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀。

举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能)

实现:装饰类包含原有类的实例对象,即可实现装饰器模式

开始:

定义一个形状的接口

//画图接口
public interface Shape {
    void draw();
}

定义一个长方形的类去实现我们的形状接口,实现画出一个长方形的功能

public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("画出长方形");
    }
}

定义一个圆形的类去实现我们形状,画出圆

public class Circle implements  Shape {

    @Override
    public void draw() {
        System.out.println("画出一个圆形");
    }
}

//需要一个包装类,抽象类,并且实现被包装对象的接口

public abstract class Decorator implements Shape {

    protected Shape shape;

    public Decorator(Shape shape) {
        this.shape = shape;
    }
    @Override
    public void draw() {
        shape.draw();
    }
}

//具体的加入新功能的包装类实现类 继承这个包装抽象类

public class RedDecorator extends Decorator {
    public RedDecorator(Shape shape) {
        super(shape);
    }
    @Override
    public void draw() {
        super.draw();
        //实现一个新的装饰
        System.out.println("实现红色包装");
    }
}

//开始测试

    public static void main(String[] args) {

        //红色长方形包装类
        Shape rectangle = new RedDecorator(new Rectangle());
        Shape circle = new RedDecorator(new Circle());
        rectangle.draw();
        circle.draw();

    }

//然后,形象的截图表示一下,

浅谈:


学到这里,大致总结一下,原本的Shape(形状)接口只是用来画出具体的形状,比如圆形,长方形,没有具体的颜色这一功能。

就好比刚开始提到的,在不改变原有类结构的情况下,加入一项新的功能。我们在这个程序里面加入的是一项红色的包装这一功能。

具体的实现就是需要一个抽象包装类去实现原有功能的接口,然后引入一个具体的实例对象,并且使用实例的具体方法。比如draw();

具体相加如什么功能,就用具体的一个类去继承这个抽象类,因为这个抽象类本身已经实现了Shape 所以具体实现的 RedDecorator本身也就是一个Shape的一个实例。

具体的调用就可以了!

暂时的理解就这么多,还是得需要多研究 ,欢迎批评指正!

原文地址:https://www.cnblogs.com/ChromeT/p/11689384.html

时间: 2024-11-06 22:15:29

10 浅谈 装饰器模式的理解与使用的相关文章

12 【结构型】 浅谈享元模式的理解与使用

享元模式 享元模式也是为了减少对象的创建,进而减少内存的重复利用而被使用的,这个和之前我们学过的单例模式,还有原型模式有着近似的相同之处, 这里大致复习一下, 单例模式:系统内只存在一个对象,比如windows里面只会存在一个任务管理器,一样的道理. 原型模式:原型模式则是通过实现Cloneable接口,调用Object 的clone方法,生成一个相同的对象. 而享元模式,有一个关键词,那就是共享,这些对象创建好之后会被共享,比如我需要一个圆形,要是内存里面已经存在这个对象,直接将这个对象的引用

浅谈设计模式(二):装饰器模式|中介模式|原型模式

装饰器模式(Decorator Pattern) 装饰器模式可用来给一个类动态添加功能,将其装饰成一个新的类.这就是装饰器的概念.看到这里我们可能会想,要达到这种效果,我们用子类继承父类不就可以了吗? 没错装饰器模式,本身是一种继承的替代方案.那既然是替代方案,那么自然就有它不一样的地方. 具体区别在哪里呢? 请看 装饰器模式更灵活:继承时父子类的关系是静态的,而装饰器模式是动态的,装饰类和被装饰类的关系是运行时候确认的 装饰类和被装饰类的耦合关系是松散的,各自可以独立变化 下面看看具体的代码.

10.9-全栈Java笔记:装饰器模式构建IO流体系

装饰器模式 装饰器模式是GOF23种设计模式中较为常用的一种模式.它可以实现对原有类的包装和装饰,使新的类具有更强的功能. 我这里有智能手机Iphone, 我们可以通过加装投影组件,实现原有手机功能的扩展.这就是一种"装饰器模式". 我们在未来普通人加装"外骨骼"装饰,让普通人具有力扛千斤的能力,也是一种"装饰器模式". [图] 手机经过投影套件"装饰后",成为功能更强的"投影手机" [示例1]装饰器模式代

设计模式之简单理解装饰器模式与运用

1.什么是装饰器模式 ? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. ? 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.装饰器模式的重要组成部分 ①装饰器模式特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

结构型模式————装饰器模式(3.1)

什么是装饰器模式? [先吃三颗栗子:] 1.PC=主机+显示器+键盘+鼠标+鼠标垫 主机是核心,而其他的组成部分都是装饰. 2.手抓饼=饼+鸡蛋+培根+黄瓜 饼是核心,鸡蛋,培根是可选的,可以理解为装饰. 3.咖啡=咖啡+牛奶+冰+方糖 咖啡是核心,牛奶等可选. 比喻虽然形象生动,但是与实际或多或少会产生偏差. 抽象的解释:装饰器模式的目的--核心部分和装饰部分可以自由组合. 装饰器模式的功能 对于软件开发来说,聚焦于软件的灵活性和可扩展性. 装饰器模式要求: 装饰可选 装饰可扩展 核心部分可扩

学习Go语言之装饰器模式

一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征. 二,定义对象接口和装饰抽象类 1 type IDecorate interface { 2 Do() 3 } 4 5 // 装饰器.实现接口,又定义了自己的事件DecorateFun,相当于抽象类 6 type Decorate struct { 7 // 待装饰的抽象类 8 decorate IDecorate 9 } 10 11 func (c

.net设计模式-装饰器模式

结构型设计模式:关注类与类之间的关系 装饰器模式:用组合+继承的方式对类作出扩展,可以动态为类型添加功能,甚至调整功能顺序,不修改业务类: 一个抽象类 1 public abstract class AbstractStudent 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public abstract void Study(); 7 } 组合+继承该抽象类 1 public class Ba

Decorator Pattern(装饰器模式)Demo1

一个简单的装饰器模式例子,用来体现直接查询,缓存查询,和过滤敏感词汇 1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.List; 8 im