`

装饰者模式--除继承外的另一种扩展方式

阅读更多

什么是装饰者模式:

 

 

在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
0
0
分享到:
评论

相关推荐

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...

    装饰者模式Demo

    总结来说,装饰者模式是一种实用的设计模式,通过组合而非继承的方式扩展对象的功能,它提供了更大的灵活性,使得代码结构更加清晰,易于维护。在`DecoratorModeDemo`中,我们可以学习如何创建和使用装饰者模式来...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_(0601).rar

    设计模式是软件开发中的一种最佳实践,它总结了在特定场景下为解决常见问题而形成的一套通用解决方案。这本书的目标是帮助开发者提升代码质量、可维护性和可扩展性,从而在项目开发中更加高效。 在C#编程中,设计...

    23个设计模式之一的装饰ppt-java-极客学院

    命令模式是另一种行为设计模式,它封装了一个请求作为方法,使得我们可以将请求作为一个参数进行传递,还可以支持撤销操作。工厂模式则是一种创建型设计模式,提供了一种创建对象的最佳方式,它隐藏了对象创建的细节...

    《设计模式--基于C#的工程化实现及扩展》.(王翔).rar_0517

    本书可能涵盖了如单例模式、工厂模式、观察者模式、装饰器模式、代理模式、建造者模式、策略模式、状态模式、适配器模式、桥接模式、组合模式、享元模式、模板方法模式、职责链模式等常见的设计模式。每种模式都详细...

    java设计模式--策略模式

    HeadFirst书中提到的装饰者模式是另一种设计模式,它允许动态地给一个对象添加一些额外的职责。装饰者模式可以为对象添加新的行为或责任,而不必修改原来的代码,遵循开闭原则。它通过将对象包装在装饰者类中来实现...

    装饰设计模式

    这种模式提供了一种替代继承的方式,使得我们可以在不修改原有类的基础上,通过创建新的类来扩展对象的功能。 在Java中,装饰设计模式通常用于在运行时为一个对象添加额外的责任或行为,而无需通过子类来实现。装饰...

    设计模式精解-GoF 23种设计模式解析.pdf

    - **定义**:代理模式为另一个对象提供一个代理以控制对这个对象的访问。 - **应用场景**:当需要控制对一个对象的访问时,可以使用代理模式。 - **优缺点**:优点是能够实现远程代理和虚拟代理等功能;缺点是增加了...

    JavaScript装饰者模式原理与用法实例详解

    JavaScript装饰者模式是一种设计模式,它允许在不改变对象本身的情况下动态地扩展对象的功能。这种模式的核心在于通过创建一个包装对象(装饰者),该包装对象与原对象具有相同的接口,以此来添加或修改原对象的行为...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或修改对象的行为。在本文中,我们将深入探讨装饰器模式的概念、功能、原理、用法以及在PHP编程中的实际应用。 首先,装饰器模式的核心思想...

    设计模式2-结构型模式.doc

    - 意图是将一个类的接口转换为客户期望的另一种接口。 - 主要解决的是在现有对象不能满足新环境接口需求时的问题。 - 实现方法可以是继承或依赖,推荐使用依赖,以保持松耦合。 - 优点包括提高复用性、透明度和...

    后端-设计模式-java-精讲

    - **继承**: 继承允许创建一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码重用和扩展性。 - **多态**: 多态是指对象可以根据上下文采用多种形态的能力。在面向对象编程中,多态通常通过接口实现或...

    23种设计模式-C++实现.zip

    - **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口。 - **桥接模式(Bridge)**:将抽象部分与实现部分分离,使它们可以独立变化。 - **装饰模式(Decorator)**:动态地给一个对象添加...

    漫谈设计模式-从面向对象开始

    继承允许一个对象通过继承另一个对象的属性和方法来获得新功能,而不需要重新编写这些功能代码。 多态性意味着不同对象可以用相同的方式进行操作。例如,一个对象可以作为基础类,其他对象可以继承这个基础类,并且...

    Java 23种设计模式13装饰模式.pdf

    相比于生成子类实现功能扩展,装饰模式提供了一种更为灵活的方式。装饰模式有时也被称为“包装器”(Wrapper)模式,尽管名称相同,但它与适配器模式的应用场景有所不同。 #### 模式结构 装饰模式主要包括以下几种...

    设计模式-创建型模式、结构型模式和行为型模式

    - **应用场景**:当需要增加对象的功能,而又不想通过继承的方式来扩展功能时。 - **优点**:比生成子类更加灵活。 3. **代理模式**: - **简介**:为其他对象提供一种代理以控制对这个对象的访问。 - **应用...

    设计模式精解-GoF 23种设计模式解析

    在C++中,装饰者模式通常通过继承一个基础接口类并覆盖部分方法来实现。 - **2.4 Composite模式**:组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有...

    head first 设计模式-C++实现.zip

    包括单例模式、工厂模式、观察者模式、装饰器模式、代理模式、命令模式、...装饰模式、适配器模式)以及行为型模式(如责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、...

Global site tag (gtag.js) - Google Analytics