设计模式的好处:
1:把同一逻辑的代码独立到方法中,注重封装性易读,易复用。
2:写类,写方法的时候,应该考虑其移植性。
3:熟练运用继承思想,把不容易发生变化的逻辑抽取到抽象类中,让子类去继承它们。
设计模式的原则:
1:单一原则:(一个逻辑只做一个事情)
2:里氏替换原则:(子类应该可以替换掉父类并且正常工作)
3:依赖倒置原则:(高层模块不应该依赖与底层模块, 二者都应该依赖于抽象, 抽象不应该依赖于细节, 细节应该依赖于抽象)
4:开闭原则(对修改关闭, 对扩展开发)
Android常用的设计模式分为:工厂模式,适配器模式,构建者模式,单例模式
工厂模式(故事背景:团队做项目开发的时候,需要用到推送SDK,组员A说极光推送SDK,开发效率快,容易集成,组员B说用,用个推SDK费用少,老板说,我不管你用什么开发,反正项目就是要做出来,这个时候我们想,能不能做一个开关,传递一个值,可以动态切换推送SDK)
//首先创建一个推送的基类,抽象一个推送方法。
public interface IPush {
public void push();
}
//创建一个个推类继承IPush类
//个推推送实现
public class GPush implements IPush{
@Override
public void push() {
System.out.println("创建了一个个推推送");
}
}
//创建一个极光推送继承IPush类
//极光推送实现
public class JPush implements IPush{
@Override
public void push() {
System.out.println("创建了一个极光推送");
}
}
//接着,创建一个工厂类,可以根据参数类型返回JPush 和 GPush
public class PushFactory {
public static int gPush = 1;
public static int jPush = 2;
//工厂模式创建推送
public static IPush createPush(int type){
if(type == 1){
return new GPush();
}else{
return new JPush();
}
}
}
测试打印结果:
public static void main(String[] args) {
IPush iPush = PushFactory.createPush(PushFactory.gPush);
iPush.push();
}
结果如下:创建了一个个推推送
工厂模式特点:
可以一定程度上解耦,消费者和产品实现类隔离开,只依赖推送接口(抽象推送方法),推送实现类如何改动与消费者完全无关。
可以一定程度增加扩展性,若增加一个推送实现,只需要实现推送接口,修改工厂创建推送的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况)。
可以一定程度增加代码的封装性、可读性。清楚的代码结构,对于消费者来说很少的代码量就可以完成很多工作。
单例模式:(动态确保一个类只有一个实例,并且向整个系统提供这个实例)
public class ActivityManage {
public volatile static ActivityManage activityManage;
private ActivityManage() {
System.out.println("创建构造方法");
}
public static ActivityManage getInstantiation(Content content) {
if (activityManage == null) {
synchronized (activityManage) {
if (activityManage == null) {
activityManage = new ActivityManage();
}
}
}
return activityManage;
}
}
单例模式的特点:
构造函数私有化,变量修饰为volatile,主要是告诉JVM当前变量在寄存器中的值是不确定的,需要从内存中读取,synchronized主要是锁定当前变量,只有当前线程可以访问变量,其他线程被阻塞。
单例模式的优点:
1:由于单例模式在内存中只有一个实例,减少内存开销。
2: 单利模式可以避免对资源的多重占用,避免对同一个资源文件的同事写操作。
3:单例模式可以在系统设置全局访问点,优化和共享资源访问。
构建者模式:(别名Builder模式:将一个复杂对象的构建与它的标识分离,使得同样的构建过程可以创建不同机构的展示)
像Android中Dialog,Retrofit ,OkhttpClient都是使用Builder模式
例如代码:
//Androd代码示例一
new MaterialDialog.Builder(activity)
.title(describe+phone)//TextConvertUtils.getFormatPhone(servePhone)
.positiveText(R.string.cancel)
.negativeText(call)
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = null;
intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + finalPhone));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(intent);
}
}).show();
//Androd代码示例二
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ConfingIp.onLineIp)
.client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//Androd代码示例三
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(getCache())
.addInterceptor(new HttpCacheInterceptor())
.addInterceptor(new LogInterceptor())
.addNetworkInterceptor(new HttpRequestInterceptor())
.build();
适配器模式:
适配器模式是把一个类的接口变换成客户端期待的另一种接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够在一起工作。适配器包括类适配器和对象适配器。
//usb是usb2接口
public interface Usb {
public int getUsb2();
}
//笔记本需要的usb是usb3
public class Notebook {
public int getUsb3(){
return 3;
}
}
public Notebook notebook;
public NotebookAdapter(Notebook notebook){
this.notebook = notebook;
}
@Override
public int getUsb2() {
return 2;
}
public int getUsb3(){
return 3;
}
public static void main(String[] args) {
NotebookAdapter notebookAdapter = new NotebookAdapter(new Notebook());
System.out.println(notebookAdapter.getUsb2());
System.out.println(notebookAdapter.getUsb3());
}
这里我定义一个Usb接口,需要适配笔记本的usb,我定义一个适配器NotebookAdapter,通过代理返回了usb2和usb3多个接口提供使用。
适配器模式的优点:
1:提高了现有类和系统类的复用性,适配器能够让一个类有更广泛的用途
2:提高了灵活性,更换适配器就能达到不同的效果,而且不用修改原有代码。
3:类适配器可以重写继承的被适配器的一些方法来增加灵活性
4:对象适配器可以传入不同的对象吧不同的对象都适配到同一个接口。