android设计模式——装饰者模式

定义:允许向一个现有的对象添加新的功能,同时又不改变其结构。

使用场景:能够动态地扩展类的功能

应用举例:一个画可以被装在画框里,并且被蒙上玻璃,这时候画,玻璃,画框组成了一个东西。

类图:

  1. Comppoent: 抽象组件
  2. ConcreteComponet:组件的具体实现类
  3. Decorator:抽象装饰者,
  4. ConcreteDecoratorA:装饰者具体实现类
  5. ConcreteDecoratorB:装饰者具体实现类
  6. Client:客户类

关键代码:

  1. Component 类充当抽象角色,不应该具体实现。
  2. 修饰类引用和继承 Component 类,具体扩展类重写父类方法。
  3. 与建造者方法不同,抽象装饰类声明了装饰着,但没有初始化。

优点:

  1. 装饰类与被装饰者可以相互发展,不相互耦合。
  2. 是继承的一个替代模式,可以动态扩展一个实现类的功能。

缺点:需要很多装饰的话,会比较复杂。

abstract class Person{
		public abstract void dressed();
	}
	//ConcreteComponet:组件的具体实现类
	class Boy extends Person{

		@Override
		public void dressed() {
			// TODO 自动生成的方法存根
			//实现最基本的逻辑
			System.out.println("王小明穿了内衣内裤");
		}
		
	}
	
	//Decorator:抽象装饰者,
	abstract class PersonCloth extends Person{
		protected Person mPerson;
		
		public PersonCloth(Person person) {
			mPerson = person;
		}
		
		public void dressed() {
			mPerson.dressed();
		}
		
	}
	
	class ExpensiveCloth extends PersonCloth{

	
		public ExpensiveCloth(Person person) {
			super(person);
			// TODO 自动生成的构造函数存根
		}
		
		private void dressShirt() {
			System.out.println("还穿上了昂贵的短袖");
		}
		
		private void dressJean() {
			System.out.println("还穿上了昂贵的牛仔裤");
		}
		
		public void dressed(){
			super.dressed();
			dressShirt();
			dressJean();
			
		}
	}	
		class CheapCloth extends PersonCloth{

			public CheapCloth(Person person) {
				super(person);
				// TODO 自动生成的构造函数存根
			}
			
			private void dressShirt() {
				System.out.println("还穿上了便宜的短袖");
			}
			
			private void dressJean() {
				System.out.println("还穿上了便宜的牛仔裤");
			}
			
			public void dressed(){
				super.dressed();
				dressShirt();
				dressJean();
				
			}
	}

主函数

public static void main(String[] args) {
		
		
		Person person = new Boy();
		
		//穿上便宜的衣服
		PersonCloth cheapCloth = new CheapCloth(person);
		cheapCloth.dressed();//展示出来

		System.out.println();

		PersonCloth expensiveCloth = new ExpensiveCloth(person);
		expensiveCloth.dressed();
		
	}

运行截图

猜你喜欢

转载自blog.csdn.net/l1094125040/article/details/83348554