public class EventBus {
private static volatile EventBus defaultInstance;
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
}
複製代碼
構造方法私有,靜態方法獲得實例 volatile 關鍵字:告訴不一樣的線程 不要拿寄存器的值,要拿主存的值 synchronized 關鍵字:能夠同步與 方法 或者 代碼塊html
用汽車爲例子java
public abstract class Call{
// 啓動 開車
public abstract Start();
}
複製代碼
// 奧迪車類
public AodiCar extends Car{
public void Start(){
system.out.println("奧迪車啓動了")
};
}
// 寶馬車類
public BWMCar extends Car{
public void Start(){
system.out.println("寶馬車啓動了")
};
}
複製代碼
public class CarFactory{
//此處傳遞過來的參數是 包.類名
public static Car getInstance(Class clazz) {
Car car = null;
try {
//利用反射 實例化對象
car = (Car)Class.forName(clazz.getName).newInstance();
}catch(Exception e) {
e.printStackTrace();
}
return car;
}
}
複製代碼
Car aodiCar= CarFactory.getInstance(AodiCar.class)
Car bmwCar= CarFactory.getInstance(BWMCar.class)
aodiCar.start();
bmwCar.start();
複製代碼
好比Retrfit中有不少個Service 你徹底能夠用工廠模式作
複製代碼
public interface Observerable{
// 用來註冊觀察者 也就是註冊用戶
void register(Observe o);
// 移除觀察者 也就是移除用戶
void unRegister(Observe o)
//通知 也就是發送推廣廣告
void notifyAll();
}
複製代碼
public interface Observe{
// 收到消息 也就是收到銀行的廣告通知
void recivered(String msg);
}
複製代碼
public class ObserverableImpl implements ObserveAble{
// 這個是存貯全部註冊過的觀察者
private ArrayList<Observe> list;
// 記錄要下發的消息
private String message;
public ObserverableImpl(){
list = new ArrayList();
}
// 添加
@Override
public void register(Observe o){
if(!list.contains(o)){
list.add(o);
}
}
//移除
@Override
public void unRegister(Observe o){
if(list.contains(o)){
list.remove(o);
}
}
//通知
@Override
public void notifyAll(){
for(int i=0;i++;i<list.size()){
list.get(i).recivered(message); // 而後調用 觀察者的方法
}
}
// 給外界暴露的方法 設置消息而且通知
public void setInfomation(String s) {
this.message = s;
//消息更新,通知全部觀察者
notifyAll();
}
}
複製代碼
public class ObserveImpl(){
private String name;
public ObserveImpl(String name){
this.name=name;
}
@Override
public void recivered(String msg){
//收到消息 去作本身的事情
System.out.println(name + " 收到推送過來的消息: " + message);
}
}
複製代碼
// 銀行
Observerable obserebale = new ObserverableImpl();
//用戶
Observer xiaoming = new ObserveImpl("小明");
Observer xiaohong = new ObserveImpl("小紅");
obserebale.register(userZhang);
obserebale.register(userLi);
// 調用Observerable的發送消息
obserebale.setInfomation("你中獎100w");
複製代碼
打印的日誌是:android
小明收到推送的消息你中獎100w
小紅收到推送的消息你中獎100w
複製代碼
public class Person {
private String mName;
private int mAge;
private String mAddress;
private Person(Builder builder) {
mName = builder.mName;
mAge = builder.mAge;
mAddress = builder.mAddress;
}
public static final class Builder {
private String mName;
private int mAge;
private String mAddress;
public Builder() {
}
public Builder setName(String name) {
mName = name;
return this;
}
public Builder setAge(int age) {
mAge = age;
return this;
}
public Builder setAddress(String address) {
mAddress = address;
return this;
}
public Person build() {
return new Person(this);
}
}
}
複製代碼
Person person = new Person.Builder().setAddress("河北邯鄲").setName("nzy").setAge(27).build();
複製代碼
他的特徵是代理類與委託類有一樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及過後處理消息等。spring
android中的hook技術,有些插件化技術,spring中經過動態代理實現了aop(切面編程),retrofit.create編程
public interface ApiService
{
@GET("/heiheihei")
public void add(int a, int b);
}
}
複製代碼
class MyInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Integer a = (Integer) args[0];
Integer b = (Integer) args[1];
System.out.println("方法名:" + method.getName());
System.out.println("參數:" + a + " , " + b);
GET get = method.getAnnotation(GET.class);
System.out.println("註解:" + get.value());
return null;
}
}
複製代碼
ApiService service = (ApiService) Proxy.newProxyInstance(ApiService.class.getClassLoader(), new Class<?>[]{ITest.class},new MyInvocationHandler())
複製代碼
動態地爲一個對象添加一些額外的職責,若要擴展一個對象的功能,裝飾者提供了比繼承更有彈性的替代方案。設計模式
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("..")));
複製代碼