Android中常用的设计模式

作者:陆金龙    发表时间:2018-07-10 08:19   


1.单例模式

private volatile static ImageLoader instance;
public static ImageLoader getInstance() {
	if (instance == null) {
		synchronized (ImageLoader.class) {
			if (instance == null) {
				instance = new ImageLoader();
			}
		}
	}
	return instance;
}

      private static volatile EventBus defaultInstance;

public static EventBus getDefault() {
	if (defaultInstance == null) {
		synchronized (EventBus.class) {
			if (defaultInstance == null) {
				defaultInstance = new EventBus();
			}
		}
	}
	return defaultInstance;
}

 

2.建造者模式(Builder Pattern)

      EventBus中的应用:

      public static EventBusBuilder builder() {

	return new EventBusBuilder();
}
public EventBus() {
	this(DEFAULT_BUILDER);
}
EventBus(EventBusBuilder builder) {
	subscriptionsByEventType = new HashMap<Class<?>, CopyOnWriteArrayList<Subscription>>();
	typesBySubscriber = new HashMap<Object, List<Class<?>>>();
	stickyEvents = new ConcurrentHashMap<Class<?>, Object>();
	mainThreadPoster = new HandlerPoster(this, Looper.getMainLooper(), 10);
	backgroundPoster = new BackgroundPoster(this);
	asyncPoster = new AsyncPoster(this);
	subscriberMethodFinder = new SubscriberMethodFinder(builder.skipMethodVerificationForClasses);
	logSubscriberExceptions = builder.logSubscriberExceptions;
	logNoSubscriberMessages = builder.logNoSubscriberMessages;
	sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent;
	sendNoSubscriberEvent = builder.sendNoSubscriberEvent;
	throwSubscriberException = builder.throwSubscriberException;
	eventInheritance = builder.eventInheritance;
	executorService = builder.executorService;
}

       

      OKHttp框架中的Request和Response

Request.Builder builder=new Request.Builder();
Request request=builder.addHeader("","")
	.url("")
	.post(body)
	.build();

private Response(Builder builder) {

	this.request = builder.request;
	this.protocol = builder.protocol;
	this.code = builder.code;
	this.message = builder.message;
	this.handshake = builder.handshake;
	this.headers = builder.headers.build();
	this.body = builder.body;
	this.networkResponse = builder.networkResponse;
	this.cacheResponse = builder.cacheResponse;
	this.priorResponse = builder.priorResponse;
  }

4. 原型模式

    Bundle类,该类实现了Cloneable接口

public Object clone() {
	return new Bundle(this);
} 
public Bundle(Bundle b) {
	super(b);

	mHasFds = b.mHasFds;
	mFdsKnown = b.mFdsKnown;
}

      Intent类,该类也实现了Cloneable接口

@Override
public Object clone() {
	return new Intent(this);
}
public Intent(Intent o) {
	this.mAction = o.mAction;
	this.mData = o.mData;
	this.mType = o.mType;
	this.mPackage = o.mPackage;
	this.mComponent = o.mComponent;
	this.mFlags = o.mFlags;
	this.mContentUserHint = o.mContentUserHint;
	if (o.mCategories != null) {
		this.mCategories = new ArraySet<String>(o.mCategories);
	}
	if (o.mExtras != null) {
		this.mExtras = new Bundle(o.mExtras);
	}
	if (o.mSourceBounds != null) {
		this.mSourceBounds = new Rect(o.mSourceBounds);
	}
	if (o.mSelector != null) {
		this.mSelector = new Intent(o.mSelector);
	}
	if (o.mClipData != null) {
		this.mClipData = new ClipData(o.mClipData);
	}
}

 

Uri uri = Uri.parse("smsto:10086");

Intent shareIntent = new Intent(Intent.ACTION_SENDTO, uri);    
shareIntent.putExtra("sms_body", "hello");    

Intent intent = (Intent)shareIntent.clone() ;
startActivity(intent);

5.装饰模式

人是个抽象的概念。这个人要干不同的事情要穿不一样的衣服,就需要进行不同的包装。

抽象的人:

public abstract class Person {
    public abstract void dress();
}

 

具体的人,也是原始的人,被装饰者:

public class Boy extends Person {
    @Override
    public void dress() {
        System.out.println("穿内衣内裤");
    }
}

抽象的装饰者:

public abstract class PersonDecorator {
    Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    public void dress(){
        person.dress();
    }
}

工作人装饰者:

public class WorkPersonDecorator extends PersonDecorator {
    public WorkPersonDecorator(Person person) {
        super(person);
    }

    @Override
    public void dress() {
        super.dress();
        dressWork();
    }

    private void dressWork(){
        System.out.println("穿西装领带");
    }
} 

客户端调用:

public class Client {
    public static void main(String[] args) {
        Person boy = new Boy();
        System.out.println("包装一个上班人:");
        WorkPersonDecorator workPersonDecorator = new WorkPersonDecorator(boy);
        workPersonDecorator.dress();
    }
}