android中常见设计模式
2017-05-19 13:00
253 查看
单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。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; } }
Build模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示如果一个类的构造需要很多参数,而且这些参数并不都是必须的,那么这种情况下就比较适合Builder。
假设有一个Person类,我们通过该Person类来构建一大批人,这个Person类里有很多属性,最常见的比如name,age,weight,height等等,并且我们允许这些值不被设置,那么我们将需要重载很多构造方法。
Person增加一个静态内部类Builder类,并修改Person类的构造函数,代码如下。
public class Person { private String name; private int age; private double height; private double weight; privatePerson(Builder builder) { this.name=builder.name; this.age=builder.age; this.height=builder.height; this.weight=builder.weight; } 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; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } static class Builder{ private String name; private int age; private double height; private double weight; public Builder name(String name){ this.name=name; return this; } public Builder age(int age){ this.age=age; return this; } public Builder height(double height){ this.height=height; return this; } public Builder weight(double weight){ this.weight=weight; return this; } public Person build(){ return new Person(this); } } }
创建person对象时
Person.Builder builder=new Person.Builder(); Person person=builder .name("张三") .age(18) .height(178.5) .weight(67.4) .build();
常见的AlertDialog,OkHttp等就使用了build模式
观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新public class Observable<T> { List<Observer<T>> mObservers = new ArrayList<Observer<T>>(); public void register(Observer<T> observer) { if (observer == null) { throw new NullPointerException("observer == null"); } synchronized (this) { if (!mObservers.contains(observer)) mObservers.add(observer); } } public synchronized void unregister(Observer<T> observer) { mObservers.remove(observer); } public void notifyObservers(T data) { for (Observer<T> observer : mObservers) { observer.onUpdate(this, data); } } }
定义一个接口
public interface Observer<T> { void onUpdate(Observable<T> observable,T data); }
用法
public class Main { public static void main(String [] args){ Observable<String> observable=new Observable<String>(); Observer<String> observer1=new Observer<String>() { @Override public void onUpdate(Observable<String> observable, String data) { System.out.println("观察者1:"+data); } }; Observer<String> observer2=new Observer<String>() { @Override public void onUpdate(Observable<String> observable, String data) { System.out.println("观察者2:"+data); } }; observable.register(observer1); observable.register(observer2); observable.notifyObservers("发布消息1"); observable.notifyObservers("发布消息2"); observable.unregister(observer1); observable.notifyObservers("发布消息3"); } }
EventBus
EventBus.getDefault().register(Object subscriber); EventBus.getDefault().unregister(Object subscriber); EventBus.getDefault().post(Object event);
RxJava
Observable<String> myObservable = Observable.create( new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> sub) { sub.onNext("Hello, world!"); sub.onCompleted(); } } );
Subscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onNext(String s) { System.out.println(s); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { } }; myObservable.subscribe(mySubscriber);
原型模式
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 更快的获取到一个相同属性的对象,内容与原型一样,内存地址i不一样。首先我们定义一个Person类 实现Cloneable接口重写clone方法
public class Person implements Cloneable { private String name; private String age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override protected Object clone() { Person person=null; try { person=(Person)super.clone(); person.name=this.name; person.age=this.age; person.gender=this.gender; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } }
Person person = new Person(); person.setAge("20"); person.setGender("男"); person.setName("赞张"); Person person1 = (Person) person.clone();
此时person和person1相同的内容 但是内存指向不一样
代理模式
提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.A找中介租房为Demo来构建代理模式,先定义一个抽象主题,IHouse
public interface IHouse { void getHouseInfo(); void signContract(); void payFees(); }
定义真实主题
public class House implements IHouse{ private final String TAG = House.class.getSimpleName(); private String name; private double price; public House(String name, double price){ this.name = name; this.price = price; } @Override public void getHouseInfo() { Log.i(TAG, "House Info- name:" + name + " ¥:" + price); } @Override public void signContract() { Log.i(TAG, "Contract:" + name + " signed at" + new SimpleDateFormat("HH:mm:ss").format(SystemClock.uptimeMillis())); } @Override public void payFees() { Log.i(TAG, "Bill: name-" + name + " $-" + price); } }
定义房屋代理,同样需要实现IHouse接口
public class ProxyHouse implements IHouse{ private final String TAG = ProxyHouse.class.getSimpleName(); private IHouse house; public ProxyHouse(IHouse house){ this.house = house; } @Override public void getHouseInfo() { Log.i(TAG, "searching"); house.getHouseInfo(); Log.i(TAG, "search finished"); } @Override public void signContract() { Log.i(TAG, "prepare contract"); house.signContract(); } @Override public void payFees() { house.payFees(); } }
对于客户来说,完全不用跟House进行直接交互,而是跟代理交互
IHouse house = new House("Downton Abbey", 5000); IHouse proxyHouse = new ProxyHouse(house); Log.i(TAG, "looking for a perfect house"); proxyHouse.getHouseInfo(); Log.i(TAG, "thinking"); proxyHouse.signContract(); proxyHouse.payFees(); Log.i(TAG, "so easy");
工厂模式
1.工厂方法模式 (Factory Method)2.抽象工厂模式 (Abstract Factory)
工厂生产不同操作系统的手机为例
public interface Phone { public void getOS(); }
再根据Phone接口实现Android,IOS,二种手机.
public class AndroidPhone implements Phone { private final String TAG = AndroidPhone.class.getSimpleName(); @Override public void getOS() { Log.i(TAG, "im Android"); } } public class IosPhone implements Phone { private final String TAG = IosPhone.class.getSimpleName(); @Override public void getOS() { Log.i(TAG, "im IOS"); } }
标准的工厂方法模式都需要有抽象的工厂接口或者基类.
public abstract class IGenerator { public abstract IPhone generatePhone() throws Exception; }
public class AndroidGenerator extends IGenerator { @Override public Phone generatePhone() { return new AndroidPhone(); } } public class IOSGenerator extends IGenerator { @Override public Phone generatePhone() { return new IosPhone(); }
生产
AndroidGenerator androidGenerator = new AndroidGenerator(); IOSGenerator iosGenerator = new IOSGenerator(); AndroidPhone android = androidGenerator.generatePhone(); IosPhone ios = iosGenerator.generatePhone();
相关文章推荐
- Android常见设计模式总结
- Android 中常见的设计模式
- android中常见的设计模式有哪些?
- Android开发中常见的设计模式(一)
- Android中常见的设计模式
- [经验分享] 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
- 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
- Android中常见的设计模式
- Android开发中常见的设计模式
- Android MVC框架模式和常见设计模式
- 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
- Android开发中常见的设计模式
- Android中常见的设计模式
- Android开发中常见的设计模式
- 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
- 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
- android中常见的设计模式有哪些?
- Android四种常见设计模式说明
- Android常见的设计模式一:单例模式
- Android开发中常见的设计模式