Android 常用设计模式——观察者模式,单例模式,Builder模式,原型模式,命令模式
?設計模式(Design pattern)是一套被反復使用的代碼設計經驗的總結。使用設計模式的目的是為了可重用代碼讓代碼更容易被他人理解
設計模式的運用,有助于代碼的維護與拓展。任何模式的出現,都是為了解決一些特定的場景的耦合問題,以達到對修改封閉,對擴展開放的效果。
?
1、實現Build步驟
1、創建實體類2、創建實體內部build類3、實體內部類返回實體類4、實體類創建內部類構造函數/*** 作者:created by meixi* 郵箱:15913707499@163.com* 日期:2018/12/14 11*/ public class PersonBuildertest {private String name;private int idd;public PersonBuildertest(Builder builder) {this.name = builder.name;this.idd = builder.idd;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getIdd() {return idd;}public void setIdd(int idd) {this.idd = idd;}public static class Builder {private String name;private int idd;public Builder name(String namein) {this.name = namein;return this;}public Builder idd(int id){this.idd =id;return this;}public PersonBuildertest build(){return new PersonBuildertest(this);}} }使用方法:
PersonBuildertest buildertest = builder.name("那么").idd(2).build(); Log.i("lgq","builertttt==="+buildertest.getName());12-14 13:45:03.313 21756-21756/? I/lgq: builertttt===那么
?
2、原型模式
?
實現步驟
1、實現Cloneable接口
2、重寫Object的clone方法
3、實現clone方法中的拷貝邏輯
?
public class Clonetest implements Cloneable{private String name;private int age;public Clonetest(){}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic Object clone(){Clonetest person=null;try {person=(Clonetest)super.clone();person.name=this.name;person.age=this.age;} catch (CloneNotSupportedException e) {e.printStackTrace();}return person;} }使用方法
Clonetest p=new Clonetest(); p.setAge(18); p.setName("張三");Clonetest p1= (Clonetest) p.clone();p1.setName("李四"); Log.i("lgq","builertttt==="+p1.getName()+"...."+p1.getAge());?
12-14 13:45:03.313 21756-21756/? I/lgq: builertttt===李四....18
?
3、單例模式的實現步驟
1、靜態實例
2、私有化構造方法
3、靜態獲取實例的函數,雙重null判斷synchronize同步處理——
使用synchronized 進行同步處理,并且雙重判斷是否為null,我們看到synchronized (Singleton.class)里面又進行了是否為null的判斷,這是因為一個線程進入了該代碼,如果另一個線程在等待,這時候前一個線程創建了一個實例出來完畢后,另一個線程獲得鎖進入該同步代碼,實例已經存在,沒必要再次創建,因此這個判斷是否是null還是必須的。
?
public class Singleton {
????private static volatile Singleton instance = null;
????private Singleton(){
????}
?
????public static Singleton getInstance() {
????????if (instance == null) {
????????????synchronized (Singleton.class) {
????????????????if (instance == null) {
????????????????????instance = new Singleton();
????????????????}
????????????}
????????}
????????return instance;
????}
}
activity管理類
public class ActivityManager { private static volatile ActivityManager instance; private Stack<Activity> mActivityStack = new Stack<Activity>(); private ActivityManager(){ } public static ActivityManager getInstance(){ if (instance == null) { synchronized (ActivityManager.class) { if (instance == null) { instance = new ActivityManager(); } } return instance; } public void addActicity(Activity act){ mActivityStack.push(act); } public void removeActivity(Activity act){ mActivityStack.remove(act); } public void killMyProcess(){ int nCount = mActivityStack.size(); for (int i = nCount - 1; i >= 0; i--) { Activity activity = mActivityStack.get(i); activity.finish(); } mActivityStack.clear(); android.os.Process.killProcess(android.os.Process.myPid()); } }?
4、觀察者模式
主要三個類
1、
public interface Observer {
? ? void update(int id,String param);
}
2、
public interface Subject {
?
? ? /**
? ? ?* 注冊一個觀察者
? ? ?*/
? ? void addObserver(Observer observer);
?
? ? /**
? ? ?* 刪除一個觀察者
? ? ?*
? ? ?* @return 是否刪除成功
? ? ?*/
? ? boolean removeObserver(Observer observer);
?
? ? /**
? ? ?* 通知所有的觀察者
? ? ?*
? ? ?* @param id 對應觀察者的id
? ? ?*/
? ? void notifyObserver(int id,String param);
?
}
3、
public class TestObServernotice implements Subject {
?
? ? private static Subject subject;
? ? private List<Observer> observers = new ArrayList<>();
?
? ? private TestObServernotice() {
? ? ? ? // TODO Auto-generated constructor stub
? ? }
?
? ? public static Subject getInstance() {
? ? ? ? if (null == subject) {
? ? ? ? ? ? synchronized (TestObServernotice.class) {
? ? ? ? ? ? ? ? if (null == subject)
? ? ? ? ? ? ? ? ? ? subject = new TestObServernotice();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return subject;
? ? }
?
? ? @Override
? ? public void addObserver(Observer observer) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? observers.add(observer);
? ? }
?
? ? @Override
? ? public boolean removeObserver(Observer observer) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? return observers.remove(observer);
? ? }
?
? ? @Override
? ? public void notifyObserver(int id,String param) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? for (Observer observer : observers) {
? ? ? ? ? ? observer.update(id,param);
? ? ? ? }
? ? }
}
?
觀察者中注冊Observer,如MainActivity中注冊
private Observer deleteObserver = new Observer() {
? ? @Override
? ? public void update(int id,String param) {
? ? ? ? tomapte.setText("sssssymd"+param);//dosomething
? ? }
};
TestObServernotice.getInstance().addObserver(deleteObserver);
同時注意刪除觀察者
@Override
protected void onDestroy() {
? ? super.onDestroy();
? ? TestObServernotice.getInstance().removeObserver(deleteObserver);
? ? deleteObserver = null;
? ? Log.v("lgq", "......11..onDestroy....");
}
調用,通知觀察者,主要在receiver中調用,fragment,activity都可以調用,跨界面刷新數據
TestObServernotice.getInstance().notifyObserver(0,bundle.getString("cn.jpush.android.ALERT"));
?
5、命令模式
實現步驟:
(1)創建命令接受者:
//命令接收者Receiver public class Tv {public int currentChannel = 0;public void turnOn() {System.out.println("lgqThe televisino is on.");}public void turnOff() {System.out.println("The television is off.");}public void changeChannel(int channel) {this.currentChannel = channel;System.out.println("Now TV channel is " + channel);} }(2)定義命令的接口,聲明執行的方法。
//執行命令的接口 public interface Command {void execute(); }(3)命令接口實現對象
//開機命令ConcreteCommand,獲取接受者類,實現命令 public class CommandOn implements Command {private Tv myTv;public CommandOn(Tv tv) {myTv = tv;}public void execute() {myTv.turnOn();} }(4)要求命令對象執行請求,通常會持有命令對象
//可以看作是遙控器Invoker public class Control {private Command onCommand, offCommand, changeChannel;public Control(Command on) {onCommand = on;}public void turnOn() {onCommand.execute();}// public void turnOff() { // offCommand.execute(); // } // // public void changeChannel() { // changeChannel.execute(); // } }(5)組裝命令對象和接收者
// 命令接收者ReceiverTv myTv = new Tv();// 開機命令ConcreteCommondCommandOn on = new CommandOn(myTv);// on.execute();// 命令控制對象Invoker,組裝接受者,命令對象Control control = new Control(on);// 開機control.turnOn();?
總結
以上是生活随笔為你收集整理的Android 常用设计模式——观察者模式,单例模式,Builder模式,原型模式,命令模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj-20-吝啬的国度(深搜)
- 下一篇: Android Notification