我所理解的设计模式之Java装饰模式

快要毕业了,之前学习的设计模式没有想到这么重要,马马虎虎就应付过去了,现在重新学习一下。

在这里写一下自己所理解的装饰模式,语言不多,看代码吧……

?





1

2

3

4

5

6

7

8

9

10

11

12

13

package
decorator;

/**

 * User.java

 * 定义一个接口,规定好一个方法,以后所有的类都去实现或重写这个方法

 * @author sztsiang

 *

 */

public
interface User {

    void
show();

}

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package
decorator;

/**

 * Person.java

 * 这里可以用一个具体的对象来实现上面的User接口

 * 此对象好比论坛里面的用户

 * @author sztsiang

 *

 */

public
class Person implements
User {

    @Override

    public
void show() {

        System.out.println("sing a song");

    }

}

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package
decorator;

/**

 * DoOtherThing.java

 * 定义装饰类的实现,以后所有的装饰类都来继承此类来实现装饰

 * 当然,该类也要实现User接口,因为此类内部的User user即可以是一个具体的Person

 * 也可以是一个具体的装饰类

 * @author sztsiang

 *

 */

public
class DoOtherThing implements
User {

    private
User user;

    public
DoOtherThing(User user){

        this.user = user;

    }

    @Override

    public
void show() {

        user.show();

    }

}

下面来写装饰类:

跳舞

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

package
decorator;

/**

 * Dancing.java

 * 一个具体的装饰类,继承自DoOtherThing

 * 功能为Person添加一个跳舞的状态

 * @author sztsiang

 *

 */

public
class Dancing extends
DoOtherThing {

    public
Dancing(User user){

        super(user);

    }

    public
void show(){

        super.show();

        doDancing();

    }

    public
void doDancing(){

        System.out.println("with dancing");

    }

}

手拿鲜花

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package
decorator;

/**

 * HandlingFlowers.java

 * 同样继承自DoOtherThing

 * 该类实现为Person添加手拿鲜花的状态

 * @author sztsiang

 *

 */

public
class HandlingFlowers extends
DoOtherThing {

    public
HandlingFlowers(User user) {

        super(user);

    }

    public
void show(){

        super.show();

        doHandlingFlowers();

    }

    

    public
void doHandlingFlowers(){

        System.out.println("and handling flowers");

    }

}

main方法里面:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package
decorator;

/**

 * MainTest.java

 * 测试类

 * @author sztsiang

 *

 */

public class MainTest {

    public
static void main(String[] args) {

        

        Person p = new
Person();//声明一个用户,里面自带唱歌功能

        Dancing d = new
Dancing(p);//给用户添加跳舞状态

        HandlingFlowers hf = new
HandlingFlowers(d);//给用户添加手拿鲜花状态

        hf.show();//展示一下

    }

}

运行结果:

sing a song
with dancing
and handling flowers

声明:此文章只是个人理解,请批评心态阅读,防止误导,如有错误,请指出,谢谢

[email protected]

时间: 2024-08-03 03:03:09

我所理解的设计模式之Java装饰模式的相关文章

《Java设计模式》之装饰模式

装饰模式(Decorator) 1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.    装饰模式以对client透明的方式动态的给一个对象附加上很多其它的责任.换言之client并不会觉的对象在装饰前和装饰后有什么差别. 3.    装饰模式能够在不创造很多其它的子类的模式下,将对象的功能加以扩展. 4.    装饰模式与类继承的差别: 1)    装饰模式是一种动态行为,对已经存

设计模式学习之装饰模式:IO流的装饰器

IO流的装饰器 题目分析:通过对java的io系列类分析得知,java的io流使用了设计模式中的装饰模式,以动态的给一个对象增加职责,能够更加灵活的增加功能.通过看io的源代码得知FilterOutputStream类继承了OutputStream类并拥有父类的一个对象,它和父类具有组合聚合的关系.因此要实现我们自己的加密类只需扩展FilterOutputStream类重写它的wite方法即可 UML图: 源代码: package com.cmc import java.io.FilterOut

我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

设计模式 -- 单例模式(Java&&PHP)

所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,使用者就可以通过这个引用使用到这个类的实例了. 单例模式在这里介绍两种,一种是饿汉,一种是懒汉. 饿汉单例模式                        

【深入理解JVM】:Java类继承关系中的初始化顺序

Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块中如果静态成员变量sam不为空,则改变sam的引用.main()方法中创建了2个主

深入理解.NET设计模式(1)

鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 Null模式 二.快速示例 部分代码: 1 class ProductService 2 { 3 4 private ProductRepository _productRepository; 5 6 public ProductService() 7 { 8 _productRepository=n

Java 反射理解(三)-- Java获取方法信息

Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void main(String[] args) { Class c1 = int.class;//int 的类类型 Class c2 = String.class;//String类的类类型,可以理解为String类字节码 Class c3 = double.class; Class c4 = Doubl

设计模式(Java语言)- 工厂方法模式

前言 在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点: 1.当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则. 2.简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展. 3.所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况.有三个继承关系的类:Father.Son.GrandSon,我们要在Son类上增强一些功能怎么办?给Son类增加方法吗?那对GrandSon的影响呢?特别是对GrandSon有多个的情况,你会怎么办?认真看完本文,你会找到你的答案. JavaIO中,像下面的嵌套语句是不是很常见,为什么要怎样定义呢?理解装饰模式后,你会找到答案. DataInputStream in = new DataInp