1. 程式人生 > >android設計模式——裝飾者模式

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();
		
	}

執行截圖