java 装饰设计模式

今天讲下设计模式中的装饰设计模式,这个在我门的IO流已经使用到了,首先看下对装饰设计模式的定义

定义:

动态的给一个对象添加一些额外的功能,就新增功能来说,装饰模式比生成子类更加灵活.

总结起来装饰设计模式2个作用:

2个作用

1:为对象添加功能,

2:添加功能是动态的

装饰器模式具有如下的特征:

它必须具有一个装饰的对象。 它必须拥有与被装饰对象相同的接口。 它可以给被装饰对象添加额外的功能。 用一句话总结就是:保持接口,增强性能

现在用代码实现以下更为直观

比如手机只能打电话,那我现在想打电话之前先听到彩铃,电话挂断后还可以继续听歌

//电话的功能,

public interface Phone {
   public void call();
}

具体某个电话的实现类

public class IPhone implements Phone {
	public IPhone() {
		super();
	}
	@Override
	public void call() {
		System.out.println("打电话");
	}
}

//装饰类的功能的扩展,但要保持有打电话功能

public abstract class PhoneDecorator implements Phone {
	private Phone phone;

	public PhoneDecorator(Phone phone) {
		super();
		this.phone = phone;
	}

	@Override
	public void call() {
         phone.call();
	}
}

//彩铃具体装饰类的实现,并添加功能

public class RingDecorator extends PhoneDecorator {

	public RingDecorator(Phone phone) {
		super(phone);
	}

	@Override
	public void call() {
		System.out.println("我要手机可以听彩铃");
		super.call();

	}
}

//音乐具体装饰类的实现 并添加播放音乐的功能

public class MusicDecorate extends PhoneDecorator {

	public MusicDecorate(Phone phone) {
		super(phone);
	}

	@Override
	public void call() {
		super.call();
		System.out.println("手机可以听音乐");
	}
}

测试类

public class DecoratorTest {
		public static void main(String[] args) {
			Phone phone = new IPhone();
			phone.call();
			System.out.println("*************************");
			PhoneDecorator pd = new RingDecorator(phone);
			pd.call();
			System.out.println("*************************");
			pd = new MusicDecorate(phone);
			pd.call();
			System.out.println("*************************");
			//现在是打电话之前有彩铃来了 挂断电话后可以听因为
			pd = new MusicDecorate(new RingDecorator(phone));
			pd.call();
		}
}

结果:

打电话

*************************

我要手机可以听彩铃

打电话

*************************

打电话

手机可以听音乐

*************************

我要手机可以听彩铃

打电话

手机可以听音乐

时间: 2024-08-07 08:38:01

java 装饰设计模式的相关文章

java装饰设计模式的由来

装饰设计模式:基于已经存在的功能,提供增强的功能 装饰设计模式的由来: Reader   ----TextReader  ----MediaReader 要为子类提供缓冲读的功能 Reader   ----TextReader        ----BufferedTextReader   ----MediaReader       -----BufferedMediaReader Reader   ----TextReader        ----BufferedTextReader   -

java装饰设计模式

将一个对象作为参数进行传递,然后对这个对象进行包装---改变其中的方法或者添加一些新的行为---装饰设计模式---装饰者模式---Decorate Model 改变一个方法: 1. 通过继承这个类,然后重写其中的方法 2. 通过对象的传递创建装饰对象,在装饰类中重新提供对应的方法继承的缺点: 1. 单继承 2. 利用向上造型创建了一个父类对象,可以调用子类中重写方法,不能在使用父类中原来的方法 3. 如果父类对象已经存在,不能使用子类中重写之后的方法 装饰设计模式的缺点: 可能提高代码的冗余度-

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

Java软件设计模式------装饰设计模式

Java软件设计模式一共分为23种; 一般常用的有: 单例设计模式 装饰设计模式 工厂设计模式 装饰设计模式 定义:英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 在生活中我们用程序员和项目经理的例子来比喻,项目经理是从程序员开始的,经过不断地积累工作经验.不断的学习新的知识,才有可能升职. 在装饰设计模式中项目经理就是程序员的增强. 程序猿: 写程序 项目

JAVA学习第四十九课 — IO流(三):缓冲区2 & 装饰设计模式

一.模拟BufferedReader 自定义MyBuffereaReader 对于缓冲区而言,里面其实就是封装一个数组,对外提供方法对数组的操作,这些方法最终操作的都是数组的角标 原理:从源中取出数据存入缓冲区,再从缓冲区不断的取出数据,取完后,继续从源中继续取数据,进缓冲区,直至源中的数据取完,用-1做为结束标记 import java.io.*; class MyBufferedReader { private FileReader fr; //定义数组作为缓冲区 private char[

Java Web总结二十Filter、装饰设计模式

一.Filter的部署--注册Filter <filter> <filter-name>testFitler</filter-name> <filter-class>org.test.TestFiter</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</p

JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化

首先看一下我们设计类的过程: 专门用于读取数据的类 MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyMeidaReader l--MyDataReader l--.......... 为了提高以上子类的工作效率,需要加入缓冲区技术.所以又会出现下面的类的继承体系. (体系1) MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyBufferedTextReader l--MyMeidaReader l--My

Java:装饰设计模式

装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能, 并提供加强功能,那么自定义的该类就称为装饰类. 装饰类通常通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的 功能. //例子1: class Person { public void chifan() { System.out.println("吃饭"); } } class SuperPerson { private Person p; public SuperPerso

java中的装饰设计模式,浅谈与继承之间的区别

最初接触装饰设计模式,一直搞不懂这么做的意义是什么,看了网上很多的资料,对于与继承的区别并没有很清楚的分析,直到看到这篇博客:http://www.cnblogs.com/rookieFly-tdiitd/p/4914593.html 这篇就很清楚的解释了装饰设计模式与继承之间的区别.下面是我自己的一些理解. 一.概念 装饰模式又称为包装模式,动态地给对象添加功能,是继承关系的一种替代方法. 二.选择 子类通过继承也能增加功能,但是关于装饰模式与继承之间如何选择,请看下面的例子. 假设:煎饼是父