百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

工作日报 2022.4.15 Android 23种设计模式

xsobi 2024-12-11 17:49 1 浏览

2022.4.15

  1. 问题澄清;

关机未上报GIS,退出登录携带是否关机退出登录;

  1. 设备鉴权822优化,服务拉起实现,coding 10%;
  2. R2_X5、记录仪构建版本验证基本功能;
  3. 加密服务新增feature;
  4. 代码仓readme文件创建;


Android 23种设计模式

1、Android 单例模式
2、Android Builder模式
3、Android 原形模式(深浅拷贝)
4、Android 工厂模式
5、Android 策略模式
6、Android 状态模式
7、Android 责任链模式
8、Android 命令模式
9、Android 观察者模式
10、Android 备忘录模式
11、Android 迭代器模式
12、Android 模板方法模式
13、Android 访问者模式
14、Android 中介者模式
15、Android 代理模式
16、Android 组合模式(View与ViewGroup)
17、Android 适配器模式(ListView与Adapter)
18、Android 装饰者模式
19、Android 享元模式
20、Android 外观模式
21、Android 桥接模式

停止更新...
以上工厂模式其实是两种设计模式。包含工厂模式和抽象工厂模式,缺少“解释器模式”由于这种模式极少运用,多用于语言的文法。所以这里不做详述。

设计模式的六大原则:
总原则:开闭原则,即对扩展开放,对修改关闭。
1 单一职责原则:每个类应该实现单一的职责,否则应该把类拆分。
2 里氏替换原则:任何基类可以出现的地方,子类一定可以出现。它是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
3 依赖倒转原则:这是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。
4 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。每个接口不存在子类用不到却必须实现的方法,否则要将接口拆分。
5 迪米特法则(最少知道原则):一个实体应当尽量少的与其他实体之间发生相互作用,使得系统的功能模块相对独立。
6 合成复用原则:尽量使用合成/聚合方式,而不是使用继承。

本文以下都是总结设计模式核心思想和代码结构要点。帮助读者记忆。阅读前建议先阅读链接里面的具体讲解,理解设计模式本身再记忆

23中设计模式分类:
创建型模式:工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式 (简单工厂模式)
结构型模式:代理模式 装饰器模式 适配器模式 外观模式 组合模式 享元模式 桥接模式
行为型模式:观察者模式 责任链模式 模板方法模式 策略模式 迭代子模式 命令模式 状态模式 备忘录模式 访问者模式 中介者模式 解释器模式

温故而知新可以为师矣

理解很重要,记住更重要,以下是总结各个模式知识点记忆要点。推荐配合代码记忆。

-------------------创建型模式------------------

1、Android 单例模式

1、一共五种方案。核心就是私有构造方法,使得创建的实例只有一个。以后都复用这个实例。
2、推荐使用带有synchronized线程保护的DCL方式,和静态内部类static final变量定义类的方式

// DLC
public class SingletionDLC {
    private volatile static SingletionDLC mInstance;
    private SingletionDLC() {}
    public static SingletionDLC getmInstance() {
        if (mInstance == null) {
            synchronized (SingletionDLC.class) {
                if (mInstance == null) {
                    mInstance = new SingletionDLC();
                }
            }
        }
        return mInstance;
    }
}
// 静态内部类
public class SingletionInternalClass {
    private SingletionInternalClass() {}
    public static SingletionInternalClass getInstance() {
        return SingletionInternalClassHolder.instance;
    }

    private static class SingletionInternalClassHolder {
        private static final SingletionInternalClass instance = new SingletionInternalClass();
    }
}

2、Android Builder模式

外部类私有构造方法带参数Buidler(静态内部类),Builder定义build方法创建外部类。

public class Person  {
    private int ID;
    private Person(Builder builder) {
        this.ID = builder.ID;
    }
    public static class Builder {
        private int ID;
        public Builder setID(int ID) {
            this.ID = ID;
            return this;
        }
        public Person build() {
            return new Person(this);
        }
    }
}

Person.Builder buider = new Person.Builder();
buider.setAge(13);
buider.setName("jack");
Person jack = buider.build();

3、Android 原型模式

1、原型模式就是一个拷贝。
2、实现implements Cloneable的clone方法,来提供类可以clone。
3、int string这种是值类型,类的对象叫引用类型。
4、数值拷贝没有深浅拷贝之分,注意引用变量拷贝,如果没有再次加clone方法,默认是浅拷贝。浅拷贝:获得变量本身,深拷贝:获得一个新的一模一样的变量。

4、Android 工厂模式

1、工厂模式分为普通工厂模式、抽象工厂模式。
2、普通工厂模式产品用抽象类定义,抽象工厂的产品用接口定义。区别在于生产的产品上。普通工厂创建的都是具体的产品。而抽象工厂创建的时接口。因为接口是抽象出来的。所以叫抽象工厂。
3、工厂代码结构要点:
普通工厂

public class NokiaFactory extends Factory {
    @Override
    public <T extends NokiaPhone> T createNokia(Class<T> clz) {
        NokiaPhone nokiaPhone = null;
        try {
            nokiaPhone = (NokiaPhone) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return (T) nokiaPhone;
    }
}

这里用的反射,你可以if else一个一个判断来写。或者一个产品对应一个工厂。都是可以的。根据需求变化。
抽象工厂

public abstract class Factory {
    public abstract component.CPU createCPU();
    public abstract component.Battery createBattery();
}

public class IPhone6Factory extends Factory {
    @Override
    public component.CPU createCPU() {
        return new A9();
    }

    @Override
    public component.Battery createBattery() {
        return new Battery1000ma();
    }
}

抽象工厂就是生产接口。因为类继承接口就拥有接口的特性。所以我们称这种生产接口的工厂模式为抽象的工厂模式。当然工厂类跟普通工厂一样。可以自己根据需求随意变化。

-------------------行为型模式------------------

5、Android 策略模式

策略模式侧重于提供不同的策略
1、假设我们现在对一个数组从小到大排序,这个时候我们写了两个策略,都继承自同一接口。实现时一个冒泡排序,一个插入排序。两个策略。结果都能正常排序。所以策略模式的重点是不同的策略上。

6、Android 状态模式

根据状态的不同,提供不同的行为。
1、以下Monday就是一个状态。这个状态下,limit有自己的实现。

public class Monday implements Check {
    @Override
    public boolean limit(int lastNumber) {
        if (lastNumber == 1 || lastNumber == 6) {
            return true;
        }
        return false;
    }
}

limitLine.setCheck(monday);
boolean mondayLimitOne = limitLine.getLimitLine(1);
boolean mondayLimitTwo = limitLine.getLimitLine(2);
limitLine.setCheck(tuesday);
boolean tuesdayLimitOne = limitLine.getLimitLine(1);
boolean tuesdayLimitTwo = limitLine.getLimitLine(2);

7、Android 责任链模式

链式结构处理,A判断是否处理,如果处理请求终止,如果不处理传递给B,这样一直传递。形成链式结构
1、代码结构。类拥有一个next对象。根据自己的条件判断是否调用到next。看如下抽象类。

abstract class Leader {
    static final String TAG = Leader.class.getSimpleName();
    public Leader nextLeader; // 上一级领导
    public final void handleLeave(StaffRequestLeave staff) {
        if (staff.getDays() <= getHandleLeaveDays()) {
            handle(staff);
        } else {
            if (nextLeader != null) {
                Log.d("Leader", "不处理,流转");
                nextLeader.handleLeave(staff);
            } else {
                refuseRequest();
            }
        }
    }

    abstract int getHandleLeaveDays(); // 批准请假天数
    abstract void handle(StaffRequestLeave staff); // 处理请假
    abstract void refuseRequest(); // 拒绝请假
}

8、Android 命令模式

“行为请求者”与“行为实现者”解耦。多个命令与行为一一对应。
代码结构记忆如下:

public interface Command {
    void execute();
}

public class LeftCommand implements Command {
    private Television tv;

    public LeftCommand(Television tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.leftVolumeeduction();
    }
}

1、具体的功能实现在Television里面。相当于用接口Command获得tv实例封装了一下。这样客户端调用就是lfteCommand.execute();不关注具体实现。

9、Android 观察者模式

一个list合集,提供add,remove遍历观察者,在调用具体方法的时候遍历list里的观察者,并调用观察者的方法

@Override
    public void sun() {
        for (WeatherOberver observerListener : list) {
            observerListener.sun();
        }
    }

10、Android 备忘录模式

用单独的类来保存和读取状态。避免直接访问数据和内部实现。
1、比如MP3,单独写一个类来保存歌名,播放百分比。退出则保存这些数据。再次进入就读取这些状态。

11、Android 迭代器模式

根据传入的list额外提供一个遍历方法。
1、迭代器实现如下

public class IteratorImpl<T> implements Iterator<T> {
    private List<T> list = new ArrayList<T>();
    private int cursor = 0;

    public IteratorImpl(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }
        return obj;
    }
}

1、通常一个容器就是一个普通的list除开add remove基础方法。
2、除开list之外再拥有一个IteratorImpl<T>对象。
容器拥有迭代器的核心代码:

@Override
    public Iterator<T> iterator() {
        return new IteratorImpl<>(list);
    }

调用如下:

Iterator<String> iterator = containerImpl.iterator();
// 迭代器提供遍历方法,遍历
while (iterator.hasNext()) {
    Log.d("Iterator",iterator.next());
}

12、Android 模板方法模式

流程封装,父类封装不可变方法。子类实现部分或全部可扩展方法。
1、代码结构。直接记Activity中的onCreate,onResume就是模板方法模式。

13、Android 访问者模式

1、被访问者不变。
2、根据访问者和被访问者的不同,两两对应达到不同的目的。
3、遍历被访问者实现“访问”。
4、代码结构记忆要点:
多个访问者都继承Visitor借口。根据visit的类型不同,达到不同的目的即:visit里写不同的操作。

public interface Visitor {
    public void visit(A a);
    public void visit(B b);
}

14、Android 中介者模式

中介者模式就是把网状复杂结构优化为一对多结构。起到协调作用。
1、代码结构记忆就是:部门长作为中介者来决策软件部、硬件部、产品部等之间合作调用关系。
2、我们常用的就是Activity当中介者,Button,TextView等各种状态来显示各种。Activity协调作用。一对多。

-------------------行为型模式------------------

15、Android 代理模式

为其他对象提供一种代理以控制这个对象的访问。
1、代理模式就是拥有被代理实例并代理它的方法,强调代理二字。
2、代理模式分为静态代理和动态代理。
3、静态代理就是直接创建一个代理类。包含所有需要代理的方法。代理调用一次。通常我们喜欢写一个Interface来约束需要代理的方法。
4、动态代理是SDK提供方法。等于用java反射来调用的需要代理的方法。所以称之为动态代理。

16、Android 组合模式(View与ViewGroup)

将部分整体的层次结构转换为树状结构,是的客户访问对象和组合对象具有一致性。
1、树状结构:Head、Node、Leaf
2、三节点写法类似。都继承一个抽象类。抽象类定义print,add,remove,getChild。
3、每个节点以一个ArrayList<>()来add remove子节点。并拥有一个遍历方法来操作。由于都继承自同一个抽象类。所以add remove的对象都可以用抽象类表示。
4、拥有add,remove,getChild的叫透明的组合模式。只有print的叫安全的组合模式。
5、透明的组合模式实现到Leaf节点的时候,继承抽象类的add,remove等方法都是空实现,因为没有子节点了。

17、Android 适配器模式(ListView与Adapter)

将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
1、有两个接口M,N,两个类A,B。A类实现接口M。现要让A也兼容N接口。
2、新建适配器类C,类适配器:C extends A implements N. 对象适配器:C implements N,C中拥有A实例
3、ListView和Adapter关系:新建适配器抽象类D。D implements N。兼容了N接口并且可以添加其他需要实现的方法。ListView以setAdapter来获得适配器。

18、Android 装饰者模式

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。和代理模式区分在于功能拓展,代理模式更强调代理二字。
1、装饰者抽象类。拥有被装饰者实例并调用方法。装饰者实现类则进行功能扩展。

19、Android 享元模式

缓存池思想“共享”对象,避免重复创建。
1、用map缓存,有就直接取用,没有时创建并push到map里。
2、Message单链表重复利用表头也可以。

20、Android 外观模式

提供统一接口,封装API。

21、Android 桥接模式

将抽象部分与实现部分分离,使它们都可以独立的进行变化。
1、实现部分独立,可以用接口或者抽象类实现
2、抽象部分拥有事项部分实例,并调用方法
3、实现部分主要是对抽象化的事物进一步的具体化操作
4、好处就是减少类的个数,如果只有一个维度,每有一个新的实现就要写一个新的类,如果是两个维度,就能避免多余类的书

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...