游戏源码网站免费,网站模板有哪些内容,com域名申请,网站建设 .影响力科技一、概述
这次来讲一下23种设计模式#xff0c;这是老生常谈的话了#xff0c;实际运用中#xff0c;能熟练并且完全掌握的设计模式#xff0c;大家估计都寥寥无几。首先需要明白一点#xff0c;你认为的设计模式的作用是什么#xff1f;不是别人认为的#xff0c;也不…一、概述
这次来讲一下23种设计模式这是老生常谈的话了实际运用中能熟练并且完全掌握的设计模式大家估计都寥寥无几。首先需要明白一点你认为的设计模式的作用是什么不是别人认为的也不是百度认为的。而我认为的设计模式是为了提供给我们更好的在开发设计中让功能具有可扩展性灵活性可复用性的方法。也许在不断地了解这些模式之后会对这个认识不断优化得出你最终认为的价值。
如果按照以往方式去讲设计模式估计就不用讲了我认为菜鸟教程已经把23种设计模式讲的很明白大家也可以直接去看教程。因此这次我决定换个方式来讲一下23种设计模式的应用。让大家看看源码当中是如何运用这些设计模式的。
二、设计模式
由于只是了解设计模式在贴源码的过程中会有系统源码、第三方库源码、又或者省略很多关注设计中不重要的代码可以根据贴的类名去查看源码文件。本次的讲的方式也会依照设计模式分类创建、结构、行为分开进行书写。
1.单例模式
使用场景用于创建唯一的对象实例常见于管理全局状态或资源。 注意虽然使用静态类也可以实现唯一实例管理全局。但是在扩展方面比如继承和多态内存管理比如延迟创建垃圾回收线程安全等都有限制。 //WindowManagerGlobal.javaprivate WindowManagerGlobal() {}UnsupportedAppUsagepublic static WindowManagerGlobal getInstance() {synchronized (WindowManagerGlobal.class) {if (sDefaultWindowManager null) {sDefaultWindowManager new WindowManagerGlobal();}return sDefaultWindowManager;}}在WindowManagerImpl中将操作View的行为交给了WindowManagerGlobal去操作其中使用的就是单例模式。不过这里使用的伪双重锁的方式实现的单例模式实际上的最佳实现还是使用静态内部类的方式实现单例模式可以自行了解。
2.工厂模式
使用场景用于创建对象通常用户替代直接使用new关键字。 注意这个模式的了解对后续的抽象工厂模式会有帮助。
//BitmapFactory.jvapublic static Bitmap decodeFile(String pathName) {return decodeFile(pathName, null);}public static Bitmap decodeResource(Resources res, int id) {return decodeResource(res, id, null);}public static Bitmap decodeStream(InputStream is) {return decodeStream(is, null, null);}和传统的工厂模式有点点区别这是通过提供多个静态接口来展现的工厂模式根据传入的资源类型创建不同的适配的bitmap对象。传统的工厂模式可能根据传入的tagname等等来判断创建不同的对象。
可以看到工厂提供的产品是抽象的具体的产品是外部使用者决定的而不需要关注创建的细节根据传入的参数决定工厂创建什么具体产品返回。
3.抽象工厂模式
使用场景提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。
//LayoutInflater.javapublic static LayoutInflater from(UiContext Context context) {LayoutInflater LayoutInflater (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);if (LayoutInflater null) {throw new AssertionError(LayoutInflater not found.);}return LayoutInflater;}public View inflate(XmlPullParser parser, Nullable ViewGroup root) {return inflate(parser, root, root ! null);}布局加载泵通过context#getSystemService就是一个创建抽象工厂创建具体工厂的过程inflate像之前讲到的工厂模式根据传入的布局xml解析的结果创建不同的View。
4.建造者模式
使用场景用于构建复杂对象的各个部分并允许按步骤创建对象。
//AlertDialog.java
AlertDialog dialog new AlertDialog.Builder(context).setTitle(Title).setMessage(Message).setPositiveButton(OK, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// Do something}}).setNegativeButton(Cancel, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// Do something}}).create();
dialog.show();这里直接给出了使用方式更容易关注到建造的过程。建造者模式更适合建造出一个组合各个建造过程中传入的对象都会在组合中承担角色。
5.原型模式
使用场景用于创建重复的对象同时又能保证性能。 注意这里的例子涉及native层的拷贝不能了解模式的使用过程建议看菜鸟驿站的原型模式例子理解。
//Bitmap.javapublic Bitmap copy(NonNull Config config, boolean isMutable) {checkRecycled(Cant copy a recycled bitmap);if (config Config.HARDWARE isMutable) {throw new IllegalArgumentException(Hardware bitmaps are always immutable);}noteHardwareBitmapSlowCall();Bitmap b nativeCopy(mNativePtr, config.nativeInt, isMutable);if (b ! null) {b.setPremultiplied(mRequestPremultiplied);b.mDensity mDensity;}return b;}这里强调是重复的对象因为通过构造函数创建对象的过程中会对字段逐个初始化特别是对象比较复杂的情况下克隆拷贝可以显著提高性能。
结构型
6.适配器模式
使用场景用于将一个接口转换成客户希望的另一个接口使接口不兼容的那些类可以一起工作。 注意给出的是源码的使用方式具体可以看JetPack#RecycleView的源码实现和使用方式。
//PopupWindowVisibility.javaArrayAdapterString autoAdapter new ArrayAdapterString(this,android.R.layout.simple_dropdown_item_1line, COUNTRIES);AutoCompleteTextView textView findViewById(R.id.auto);textView.setAdapter(autoAdapter);通过适配器接口将用户输入的内容转换成另一个接口适配的内容这就是适配器工作的原理。
7.桥接模式
使用场景用于将抽象部分与它的实现部分分离使它们都可以独立的变化。
//RecyclerView使用private RecyclerView recyclerViewA;private RecyclerView recyclerViewB;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerViewA findViewById(R.id.recyclerView1);recyclerViewA.setLayoutManager(new LinearLayoutManager(this));recyclerViewA.setAdapter(new OneItemAdapter(itemList));recyclerViewB findViewById(R.id.recyclerView2);recyclerViewB.setLayoutManager(new LinearLayoutManager(this));recyclerViewB.setAdapter(new TwoItemAdapter(itemList));}在分离抽象和实现的前提下还有就是避免类爆炸当一个类有多个维度的变化时会导致类的数量急剧增加这点很重要。使用桥接模式我们只需要独立的扩展抽象部分和实现部分。
举例一个图形类它可以有不同颜色或者再多一个维度如果不使用桥接模式我们就需要根据形状和颜色的这些维度组合进行排列组合这样类的增加数量就是指数级的。
8.组合模式
使用场景用于将对象组合成树形结构以表示“部分-整体”的层次结构。
//ViewGroup.java
UiThread
public abstract class ViewGroup extends View implements ViewParent, ViewManager {UnsupportedAppUsageprotected ArrayListView mDisappearingChildren;
}ViewGroup本身继承View管理了一个集合来存储它的子View。简化树形结构中对象的处理无论它们是单个对象还是组合对象。
试想一下建立的ViewTree通过List管理ViewGroupA、ViewGroupB它们每个视图组下又有若干个其他的子视图View它们当中也有的View可能是一个ViewGroup包含其他的子视图View形成的树形结构。
9.装饰器模式
//未完待续