編輯:關於Android編程
裝飾模式也稱為包裝模式,是結構型設計模式之一。裝飾模式是一種用於替代繼承技術的一種方案。
動態的給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。
(1)需要透明且動態地擴展類的功能時。且在不影響其他對象的情況下。
(2)當不能采用繼承對系統進行擴展時可以使用裝飾模式。比如final類。
(1)Component
:抽象組件。可以是一個接口或抽象類,其充當的就是被裝飾的原始對象。
(2)ConcreteComponent
:組件具體實現類,該類是Component類的基本實現,也是我們裝飾的具體對象。
(3) 以一個男孩穿衣裝扮為例。實現給男孩在家與出門的穿衣裝扮。 抽象組件類(Component): 具體實現類(ConcreteComponent):表示要裝扮的Boy 抽象裝飾類(Decorator):PersonCloth 表示人所穿著的衣服 出門穿的衣服: 在家穿的衣服: 裝扮: 結果 (1)裝飾模式是以對客戶端透明的方式擴展對象的功能,是繼承方案的一個替代;而代理模式則是給一個對象提供一個代理對象,並有代理對象來控制對原有對象的引用。 (2)裝飾模式應該為所裝飾的對象增強功能;代理模式是對代理對象施加控制,不對對象本身功能進行增強。 適配器模式是用新接口來調用原接口,原接口對新系統是不可見的;裝飾模式增強了其他對象的功能而同時又不改變它的接口。 在實際開發中我們應該寫過如下代碼:其實這些新增方法的調用就類似裝飾模式中的裝飾者的職責,只不過這裡我們沒有保持對組件類的引用。 (1)對於擴展一個對象的功能,裝飾模式比繼承更加靈活性,不會導致類的個數急劇增加。 (2)可以通過一種動態的方式在運行時選擇不同的具體裝飾類,從而實現不同的行為。 (3)可以對一個對象進行多次裝飾,通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合,得到功能更為強大的對象。 (4)具體構件類與具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件類和具體裝飾類,原有類庫代碼無須改變,符合“開閉原則”。 (1)使用裝飾模式進行系統設計時將產生很多小對象,這些對象的區別在於它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,大量小對象的產生勢必會占用更多的系統資源,在一定程序上影響程序的性能。 (2)對於多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為繁瑣。DecZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmF0b3I8L2NvZGU+o7qz6c/z17DKztXfo6zG5Naw1PC+zcrH17DKzs7Sw8e1xNfpvP621M/zo6zNqLn9xuTX08DgwKnVubjDt723qNLUtO+1vdewys61xMS/tcSho8bkxNqyv9K7tqjSqtPQ0ru49ta4z/LX6bz+ttTP87XE0v3Tw6Gj1Nq087bgyv3H6b/2z8KjrLjDwODOqrPpz/PA4KOs0OjSqrj5vt2yu82stcTXsMrOwt+8rcq1z9ayu82stcS+38zl19PA4KGjPC9wPg0KPHA+o6g0o6k8Y29kZT5Db25jcmV0ZURlY29yYXRvckE8L2NvZGU+oaI8Y29kZT5Db25jcmV0ZURlY29yYXRvckI8L2NvZGU+o7rXsMrO18W+38zlyrXP1sDgoaO4utTwz/K5ubz+zO2809DCtcTWsNTwoaM8L3A+DQo8aDIgaWQ9"4簡單實現">4.簡單實現
public abstract class Person {
/**
* Person下有一個穿著的抽象方法
*/
public abstract void dressed();
}
public class Boy extends Person{
@Override
public void dressed() {
System.out.println("Boy穿了內衣內褲");
}
}
public class PersonCloth extends Person{
protected Person mPerson; //保持一個Person類的引用
public PersonCloth(Person mPerson) {
super();
this.mPerson = mPerson;
}
@Override
public void dressed() {
mPerson.dressed();
}
}
public class OutsideCloth extends PersonCloth{
public OutsideCloth(Person mPerson) {
super(mPerson);
}
/**
* 穿短袖
*/
private void dressShirt(){
System.out.println("穿件短袖");
}
/**
* 穿牛仔褲
*/
private void dressJean(){
System.out.println("穿牛仔褲");
}
/**
* 穿鞋子
*/
private void dressShoes(){
System.out.println("穿鞋子 ");
}
@Override
public void dressed() {
super.dressed();
dressShirt();
dressJean();
dressShoes();
}
}
public class HomeCloth extends PersonCloth{
public HomeCloth(Person mPerson) {
super(mPerson);
}
/**
* 穿短褲
*/
private void dressShorts(){
System.out.println("穿短褲");//在家裡隨便點
}
@Override
public void dressed() {
super.dressed();
dressShorts();
}
}
public class Client {
public static void main(String[] args) {
//首先有一個男孩
Person person = new Boy();
//在家
PersonCloth personCloth = new HomeCloth(person);
personCloth.dressed();
System.out.println("--------------");
//出門
PersonCloth personCloth1 = new OutsideCloth(person);
personCloth1.dressed();
}
}
Boy穿了內衣內褲
穿短褲
--------------
Boy穿了內衣內褲
穿件短袖
穿牛仔褲
穿鞋子
5.Android源碼中的實現
1.Context
Context
類在Android中被稱為“上帝對象”,它的本質就是一個抽象類,在裝飾模式中相當於抽象組件,而在內部定義了大量的抽象方法,比如我們經常用到的startActivity
方法。而真正實現是在ContextImpl
中完成,那麼ContextImpl
就是具體實現類。因為ContextWrapper
繼承於Context
,所以ContextWrapper
就是裝飾者。具體大家可以自行查看源碼。6.區別
1.與代理模式的區別
2.與適配器模式的區別
7.總結
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化數據
initData();
//初始化控件
initViews();
//初始化事件
initEvent();
}
1.優點
2.缺點
學習知識:界面組成、事件監聽器====界面組成====1.用戶界面的基本組件叫做View,都是繼承android.view.View類,Android裡面預定義很多基本的
Android對這種方法進行了封裝,我們沒有權限去調用這個方法,所以我們只能通過AIDL,然後利用Java的反射機制去調用系統級的方法。下面上代碼:(注釋比較詳細)/**
本文實例介紹了Android如何畫出觸摸軌跡的方法,分享給大家供大家參考,具體內容如下效果圖:實現代碼:package com.android.gameview5;imp
package com.example.administrator.newstop;import android.os.Bundle;import