什么是装饰者模式:
在java中,如果你希望扩展现有类的功能,那么你一定首先想到的是继承现有类(至少我是这样),那么装饰者模式可以让你不使用继承,一样扩展现有类的功能,且不需要对现有类进行修改,让你多了一种扩展现有类的功能的选择。
设计原则
对扩展开发,对修改关闭。
java.io包内的大量的类都是装饰者,下面这张图就一目了然了
这张图来自http://prowl.iteye.com/blog/477100我为了图个方便就不去自己画了,对原作者表示感谢。
它的原始出处应该是来自Head First Design Pattern P101。今天的这个例子也是摘自这本书中的,不过我对其进行了一些改动,以便适合在Android上运行。
要实现的东西是:在assets文件夹中放入一个写有字符的txt文本文件,我将它读取出来,然后通过使用自定义的装饰者类将它里面的所有的大写字符改为小写。
效果图:
下面直接上代码:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 原始字符 -->
<TextView
android:id="@+id/tv_originality_character"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
<!-- 转换后的小写字符 -->
<TextView
android:id="@+id/tv_lower_character"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_originality_character"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private TextView tvShowOriginalityCharacter;
private TextView tvShowLowerCharacter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShowOriginalityCharacter = (TextView)findViewById(R.id.tv_originality_character);
tvShowLowerCharacter = (TextView)findViewById(R.id.tv_lower_character);
//显示data.txt中原来的文字
try {
InputStream is = getAssets().open("data.txt");
String str = "";
int c;
while((c = is.read()) >= 0)
{
str = str + (char)c;
}
tvShowOriginalityCharacter.setText(str);
} catch (IOException e) {
e.printStackTrace();
}
//显示data.txt中转为小写字符后的文字
try {
LowerCaseInputStream lcis = new LowerCaseInputStream(getAssets().open("data.txt"));
String str = "";
int c;
while((c = lcis.read()) >= 0)
{
str = str + (char)c;
}
tvShowLowerCharacter.setText(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 注意这个类的构造器接收的参数是InputStream类型。
* 覆盖read()方法,这实际上和你写一个类extend InputStream,然后Override它的read()方法所达到的效果是一样的。
* 当然,你不仅可以覆盖这个类原来的方法,也可以让这个类添加新的方法。这也和继承起到的作用是一样的。
*
* LowerCaseInputStream就是一个装饰者。
*
* */
class LowerCaseInputStream extends FilterInputStream
{
public LowerCaseInputStream(InputStream in)
{
super(in);
}
@Override
public int read() throws IOException
{
int c = super.read();
return (c == -1 ? c : Character.toLowerCase((char)c));
}
//You can add some more methods...
}
- 大小: 124.9 KB
- 大小: 36.8 KB
分享到:
相关推荐
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧,你将能够在不修改任何底层...
装饰者模式:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案
Android自定义控件---继承ProgressBar功能扩展 博客地址:http://blog.csdn.net/u012814441
设计模式--装饰模式,通过与类的继承的比较,简单讲述了装饰模式的好处。
桥接模式-继承-iOS
万山-------继承.zip
第一天-----抽象 继承.md
装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...
c++程序设计语言---7-继承.ppt
云教学平台环境,投影仪 教学过程与内容 设计意图 时间 环节一:理解什么是继承 Python继承是面向对象中三大特征之一,继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的属性和...
设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式...
天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列教程之-28类--继承天轰穿系列...
装饰者模式定义:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 设计原则:类应该对扩展开放,对修改关闭
装饰者模式是在不改变原有类和不使用继承的情况下,动态地扩展一个对象的功能,代码中通过对象参数进行选择。
云南大学设计模式装饰者模式:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。在熟悉装饰者模式相关理论知识的基础上,使用装设者模式实现米线店结账小程序。
pta题目java的继承覆盖综合题源码,全部内容为自己原创,能够运行但是有些代码可能写的不是很精简,这个摘要也太长了吧,凑不够字数啊
mongoose-schema-extend, mongoose架构继承和鉴别器密钥扩展 mongoose-schema-extend实现架构继承和可选鉴别器键,用于存储集合中不同类型的相关文档,并以正确的模型类型获取它们。通知从 0.2.1版本mongoose-schema...
tutorial3----类的继承与派生[定义].pdf
tutorial3----类的继承与派生[汇编].pdf
装饰模式的一个简单实例,小猪吃苹果的游戏,每吃一种苹果,增加一种不同的功能。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。