diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc0697d --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Eclipse +.classpath +.project +.settings/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# SVN +.svn/ + +# Maven +log/ +target/ + +# Syswin +disconf/ +logs/ +/NewInnerAPI/ diff --git a/DesignPattern.iml b/DesignPattern.iml deleted file mode 100644 index bb5b383..0000000 --- a/DesignPattern.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index d9d964d..77e4500 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,13 @@ # DesignPattern -> 参照Hongyang的CSDN博客所写。如有错误欢迎指正,如有侵权,请联系我删除。 - -#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式) - -> 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 +设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式分为三种类型,共23种: - - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、抽象工厂模式、建造者模式、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。 - - **结构型模式**:[适配器模式](https://github.com/youlookwhat/DesignPattern#5-适配器模式)、桥接模式、[装饰模式](https://github.com/youlookwhat/DesignPattern#7-装饰者模式)、组合模式、[外观模式](https://github.com/youlookwhat/DesignPattern#8-外观模式)、享元模式、代理模式。 - - **行为型模式**:[模版方法模式](https://github.com/youlookwhat/DesignPattern#9-模板方法模式)、[命令模式](https://github.com/youlookwhat/DesignPattern#6-命令模式)、迭代器模式、[观察者模式](https://github.com/youlookwhat/DesignPattern#1-观察者模式)、中介者模式、备忘录模式、解释器模式、[状态模式](https://github.com/youlookwhat/DesignPattern#10-状态模式)、[策略模式](https://github.com/youlookwhat/DesignPattern#4-策略模式)、职责链模式(责任链模式)、访问者模式。 + - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[建造者模式](https://github.com/youlookwhat/DesignPattern#11-建造者模式)、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[原型模式](https://github.com/youlookwhat/DesignPattern#12-原型模式)。 + - **结构型模式**:[适配器模式](https://github.com/youlookwhat/DesignPattern#5-适配器模式)、[桥接模式](https://github.com/youlookwhat/DesignPattern#15-桥接模式)、[装饰模式](https://github.com/youlookwhat/DesignPattern#7-装饰者模式)、[组合模式](https://github.com/youlookwhat/DesignPattern#16-组合模式)、[外观模式](https://github.com/youlookwhat/DesignPattern#8-外观模式)、[享元模式](https://github.com/youlookwhat/DesignPattern#13-享元模式)、[代理模式](https://github.com/youlookwhat/DesignPattern#14-代理模式)。 + - **行为型模式**:[模版方法模式](https://github.com/youlookwhat/DesignPattern#9-模板方法模式)、[命令模式](https://github.com/youlookwhat/DesignPattern#6-命令模式)、[迭代器模式](https://github.com/youlookwhat/DesignPattern#17-迭代器模式)、[观察者模式](https://github.com/youlookwhat/DesignPattern#1-观察者模式)、[中介者模式](https://github.com/youlookwhat/DesignPattern#18-中介者模式)、[备忘录模式](https://github.com/youlookwhat/DesignPattern#19-备忘录模式)、[解释器模式](https://github.com/youlookwhat/DesignPattern#20-解释器模式)、[状态模式](https://github.com/youlookwhat/DesignPattern#10-状态模式)、[策略模式](https://github.com/youlookwhat/DesignPattern#4-策略模式)、[责任链模式](https://github.com/youlookwhat/DesignPattern#21-责任链模式)、[访问者模式](https://github.com/youlookwhat/DesignPattern#22-访问者模式)。 + +> 参照Hongyang、菜鸟教程等处文章所写。如有错误欢迎指正,如有侵权,请联系我删除。 ---- @@ -35,31 +33,59 @@ - 9.[ 设计模式 模版方法模式(Template Method Pattern) 展现程序员的一天](http://blog.csdn.net/lmj623565791/article/details/26276093) - 10.[ 设计模式 状态模式(State Pattern) 以自动售货机为例](http://blog.csdn.net/lmj623565791/article/details/26350617) + + - 11.[ 设计模式 建造者模式(Builder Pattern) 以造汽车买汽车为例](https://wiki.jikexueyuan.com/project/java-design-pattern/builder-pattern.html) + + - 12.[ 设计模式 原型模式(Prototype Pattern) 以获取多种形状为例](https://www.runoob.com/design-pattern/prototype-pattern.html) + + - 13.[ 设计模式 享元模式(Flyweight Pattern) 以随机获取多种形状为例](https://www.runoob.com/design-pattern/flyweight-pattern.html) + + - 14.[ 设计模式 代理模式(Proxy Pattern) 以获取磁盘中的图片为例](https://www.runoob.com/design-pattern/proxy-pattern.html) + + - 15.[ 设计模式 桥接模式(Bridge Pattern) 以画不同颜色的圆为例](https://www.runoob.com/design-pattern/bridge-pattern.html) + + - 16.[ 设计模式 组合模式(Composite Pattern) 以创建和打印员工的层次结构为例](https://www.runoob.com/design-pattern/composite-pattern.html) + + - 17.[ 设计模式 迭代器模式(Iterator Pattern) 以使用迭代器打印名字为例](https://www.runoob.com/design-pattern/iterator-pattern.html) + + - 18.[ 设计模式 中介者模式(Mediator Pattern) 以公共聊天室为例](https://www.runoob.com/design-pattern/mediator-pattern.html) + + - 19.[ 设计模式 备忘录模式(Memento Pattern) 以使用备忘录为例](https://www.runoob.com/design-pattern/memento-pattern.html) + + - 20.[ 设计模式 解释器模式(Interpreter Pattern) 以解释一句话为例](https://www.runoob.com/design-pattern/interpreter-pattern.html) + + - 21.[ 设计模式 责任链模式(Chain of Responsibility Pattern) 以Android Studio中打印日志为例](https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html) + + - 22.[ 设计模式 访问者模式(Visitor Pattern) 以显示计算机的组成部分为例](https://www.runoob.com/design-pattern/visitor-pattern.html) ## Source Code -> - 1. [Observer](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer) -> - 2. [Factory](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/factory) -> - 3. [Singleton](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/singleton) -> - 4. [Strategy](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/strategy) -> - 5. [Adapter](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/adapter) -> - 6. [Command](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/command) -> - 7. [Decorator](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/decorator) -> - 8. [Facade](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/facade) -> - 9. [Template Method](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/templatemethod) -> - 10. [State](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/state) +> - [Observer](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer) +> - [Factory](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/factory) +> - [Singleton](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/singleton) +> - [Strategy](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/strategy) +> - [Adapter](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/adapter) +> - [Command](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/command) +> - [Decorator](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/decorator) +> - [Facade](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/facade) +> - [Template Method](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/templatemethod) +> - [State](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/state) +> - [Builder](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/builder) +> - [Prototype](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/prototype) +> - [Flyweight](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/flyweight) +> - [Proxy](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/proxy) +> - [Bridge](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/bridge) +> - [Composite](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/composite) +> - [Iterator](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/iterator) +> - [Mediator](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/mediator) +> - [Memento](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/memento) +> - [Chain of Responsibility](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility) +> - [Visitor](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/visitor) ## Project Picture - - - - - - - - - +![](https://raw.githubusercontent.com/youlookwhat/DesignPattern/master/image/ds1.png) +![](https://raw.githubusercontent.com/youlookwhat/DesignPattern/master/image/ds2.png) ## Pattern Analysis ### 1. 观察者模式 @@ -69,27 +95,27 @@ - 专题接口:[Subject.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/interfaces/Subject.java) ; - ```java - /** - * 注册一个观察者 - */ - public void registerObserver(Observer observer); - - /** - * 移除一个观察者 - */ - public void removeObserver(Observer observer); - - /** - * 通知所有观察者 - */ - public void notifyObservers(); - ``` + ```java + /** + * 注册一个观察者 + */ + public void registerObserver(Observer observer); + + /** + * 移除一个观察者 + */ + public void removeObserver(Observer observer); + + /** + * 通知所有观察者 + */ + public void notifyObservers(); + ``` - 3D服务号的实现类:[ObjectFor3D.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/classs/ObjectFor3D.java) ```java - @Override + @Override public void registerObserver(Observer observer) { observers.add(observer); } @@ -117,15 +143,15 @@ - 所有观察者需要实现此接口:[Observer.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/interfaces/Observer.java) - ```java - public ObserverUser1(Subject subject) { + ```java + public ObserverUser1(Subject subject) { subject.registerObserver(this); } @Override public void update(String msg) { - Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。 "); + Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。"); } - ``` + ``` - 最后测试:[ObserverActivity.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java) @@ -236,7 +262,7 @@ return singletonLanHanFour; } -``` + ``` - 内部类[推荐用]:[SingletonIn.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/singleton/inclass/SingletonIn.java) - 枚举[推荐用]:[SingletonEnum.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/singleton/enums/SingletonEnum.java) @@ -275,12 +301,12 @@ - 我们拥有的是220V家用交流电: [V220Power.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/adapter/V220Power.java) - **适配器,完成220V转5V的作用**:[V5PowerAdapter.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/adapter/V5PowerAdapter.java) - 最后测试:给手机冲个电: - - ```java - Mobile mobile = new Mobile(); + + ```java + Mobile mobile = new Mobile(); V5Power v5Power = new V5PowerAdapter(new V200Power()); mobile.inputPower(v5Power); - ``` + ``` ### 6. 命令模式 > 定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(简化: 将请求封装成对象,将动作请求者和动作执行者解耦。) @@ -316,15 +342,15 @@ - 2、各个装备的实现类: - eg:**武器**的实现类: [ArmEquip.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/decorator/equip/ArmEquip.java) -- 3、装饰品的超类(装饰品也属于装备):[IEquipDecorator.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecotator.java) +- 3、装饰品的超类(装饰品也属于装备):[IEquipDecorator.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecorator.java) - 4、装饰品的实现类: - - eg:**蓝宝石**的实现类(可累加): [BlueGemDecorator.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecotator.java) + - eg:**蓝宝石**的实现类(可累加): [BlueGemDecorator.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecorator.java) - 5、最后测试:计算攻击力和查看描述: ```java Log.e("---", "一个镶嵌2颗红宝石,1颗蓝宝石的靴子: "); - IEquip iEquip = new RedGemDecotator(new RedGemDecotator(new BlueGemDecotator(new ShoeEquip()))); + IEquip iEquip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip()))); Log.e("---", "攻击力:" + iEquip.caculateAttack()); Log.e("---", "描述语:" + iEquip.description()); ``` @@ -337,8 +363,8 @@ - eg: 爆米花机:[PopcornPopper.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/facade/device/PopcornPopper.java) - 电影院类:[HomeTheaterFacade.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/facade/theater/HomeTheaterFacade.java) - ```java - /** + ```java + /** * 一键观影 */ public void watchMovie() { @@ -351,9 +377,10 @@ player.on(); player.make3DListener(); } - ``` + ``` + - 最后测试:一键观影: - + ```java new HomeTheaterFacade(computer, light, player, popcornPopper, projector).watchMovie(); ``` @@ -423,12 +450,12 @@ - 定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的。 - - 需求:已自动售货机为例(有已投币、未投币等状态和投币、投币等方法) + - 需求:以自动售货机为例(有已投币、未投币等状态和投币、退币等方法) - 最初实现待改进的售货机:[VendingMachine.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/state/old/VendingMachine.java) - 改进后的售货机(更具有延展性):[VendingMachineBetter.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/state/better/VendingMachineBetter.java) - - ```java - // 放钱 + + ```java + // 放钱 public void insertMoney() { currentState.insertMoney(); } @@ -454,8 +481,9 @@ public void setState(State state) { this.currentState = state; } - ``` - + ``` + + - 状态的接口:[State.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/state/better/State.java) - 对应状态的接口实现类: - eg: 中奖状态:[WinnerState.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/state/better/WinnerState.java) @@ -470,13 +498,1029 @@ machineBetter.turnCrank(); ``` + +### 11. 建造者模式 +> 建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 + + - 需求:用户去汽车店购买汽车。 + - 分析:汽车店根据每个用户的需求提取对应汽车 + - 建造者超类:[Builder](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java) + + ```java + public abstract class Builder { + + public abstract void setPart(String name, String type); + + public abstract Product getProduct(); + } + ``` + +- 建造者对应实现类:[ConcreteBuilder](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java) + + ```java + public class ConcreteBuilder extends Builder { + + private Product product = new Product(); + + @Override + public void setPart(String name, String type) { + product.setName(name); + product.setType(type); + } + + @Override + public Product getProduct() { + return product; + } + } + ``` + +- 店长[Director](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java)取汽车: + + ```java + // 店长 + Director director = new Director(); + // 得到宝马汽车,内部实现提取宝马汽车的详情操作 + Product product = director.getBProduct(); + // 展示汽车信息 + product.showProduct(); + ``` + +### 12. 原型模式 +> 原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 + +这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 + +以获取多种形状为例,共分四步: + +- 1、创建一个实现了 Cloneable 接口的抽象类。[Shape](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java)(implements Cloneable) + + ```java + public abstract class Shape implements Cloneable { + + private String id; + protected String type; + + public abstract void draw(); + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public Object clone() { + Object object = null; + try { + object = super.clone(); + } catch (CloneNotSupportedException e) { + Log.e("--", e.getMessage()); + } + return object; + } + } + ``` + +- 2、创建扩展了上面抽象类的实体类。[Circle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java)、[Rectangle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java)、[Square](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java) + + ```java + public class Circle extends Shape { + + public Circle() { + type = "Circle"; + } + + @Override + public void draw() { + Log.e("---", "Inside Circle::draw() method."); + } + + } + ``` + +- 3、创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。[ShapeCache](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java) + + ```java + public class ShapeCache { + + private static Hashtable shapeMap = new Hashtable(); + + public static Shape getShape(String shapeId) { + Shape shapeCache = shapeMap.get(shapeId); + return (Shape) shapeCache.clone(); + } + + // 对每种形状都运行数据库查询,并创建该形状 + // shapeMap.put(shapeKey, shape); + // 例如,我们要添加三种形状 + public static void loadCache() { + Circle circle = new Circle(); + circle.setId("1"); + shapeMap.put(circle.getId(), circle); + + Rectangle rectangle = new Rectangle(); + rectangle.setId("2"); + shapeMap.put(rectangle.getId(), rectangle); + + Square square = new Square(); + square.setId("3"); + shapeMap.put(square.getId(), square); + } + } + ``` + +- 4、使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。 + + ```java + // 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。 + ShapeCache.loadCache(); + Shape shapeCache1 = ShapeCache.getShape("1"); + Shape shapeCache2 = ShapeCache.getShape("2"); + Shape shapeCache3 = ShapeCache.getShape("3"); + ``` + +### 13. 享元模式 +> 主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 + +享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。 + + - **主要解决**:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 + +以随机获取多种形状为例,共分四步: + + - 1、创建一个接口。 + + ```java + public interface Shape { + void draw(); + } + ``` + + - 2、创建实现接口的实体类。 + + ```java + public class Circle implements Shape { + + private String color; + private int x; + private int y; + private int radius; + + public Circle(String color) { + this.color = color; + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + public void setRadius(int radius) { + this.radius = radius; + } + + @Override + public void draw() { + Log.e("---", "Circle: Draw() [Color : " + color + + ", x : " + x + ", y :" + y + ", radius :" + radius); + } + } + ``` + + + - 3、创建一个工厂,生成基于给定信息的实体类的对象。 + + ```java + public class ShapeFactory { + + private static final HashMap circleMap = new HashMap(); + + public static Shape getShape(String color) { + Shape shape = circleMap.get(color); + if (shape == null) { + shape = new Circle(color); + circleMap.put(color, shape); + Log.e("getShape", "Creating circle of color : " + color); + } + return shape; + } + + } + ``` + + + - 4、使用该工厂,通过传递颜色信息来获取实体类的对象。 + + ```java + for (int i = 0; i < 20; i++) { + Circle circle = (Circle) ShapeFactory.getShape(getRandomColor()); + circle.setX(getRandomX()); + circle.setY(getRandomY()); + circle.setRadius(100); + circle.draw(); + } + ``` + +### 14. 代理模式 +> 一个类代表另一个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。可以理解为内存中没有这个对象就创建,有就直接返回这个对象。 + + - **主要解决**:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。 + +以获取磁盘中的图片为例,总共分三步: + + - 1、创建一个接口。 + + ```java + public interface Image { + void display(); + } + ``` + + - 2、创建实现接口的实体类 RealImage。对应代理类:ProxyImage。 + + ```java + public class RealImage implements Image { + + private String fileName; + + public RealImage(String fileName) { + this.fileName = fileName; + loadFromDisk(fileName); + } + + private void loadFromDisk(String fileName) { + Log.e("RealImage", "loading " + fileName); + } + + @Override + public void display() { + Log.e("RealImage", "Displaying " + fileName); + } + } + ``` + + ```java + public class ProxyImage implements Image { + + private String fileName; + private RealImage realImage; + + public ProxyImage(String fileName) { + this.fileName = fileName; + } + + @Override + public void display() { + if (realImage == null) { + realImage = new RealImage(fileName); + } + realImage.display(); + } + } + ``` + + - 3、当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。 + + ```java + Image image = new ProxyImage("test_10mb.png"); + // 第一次是new的,图像从磁盘加载 + image.display(); + // 第二次取缓存,图像不需要从磁盘加载 + image.display(); + ``` + +### 15. 桥接模式 +> 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 + + - **主要解决**:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 + +以画不同颜色的圆为例,实现共分五步: + + - 1、创建桥接实现接口。 + + ```java + public interface DrawAPI { + void drawCircle(int radius, int x, int y); + } + ``` + + - 2、创建实现了 DrawAPI 接口的实体桥接实现类。[RedCircle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/bridge/RedCircle.java)、[GreenCircle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/bridge/GreenCircle.java) + + ```java + public class RedCircle implements DrawAPI { + + @Override + public void drawCircle(int radius, int x, int y) { + Log.e("---", "Drawing Circle[ color: red, radius: " + + radius + ", x: " + x + ", " + y + "]"); + } + } + ``` + + - 3、使用 DrawAPI 接口创建抽象类 [Shape](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/bridge/Shape.java)。 + + ```java + public abstract class Shape { + + protected DrawAPI drawAPI; + + protected Shape(DrawAPI drawAPI) { + this.drawAPI = drawAPI; + } + + public abstract void draw(); + } + ``` + + - 4、创建实现了 Shape 接口的实体类。 + + ```java + public class Circle extends Shape { + + private int x, y, radius; + + protected Circle(int x, int y, int radius, DrawAPI drawAPI) { + super(drawAPI); + this.x = x; + this.y = y; + this.radius = radius; + } + + @Override + public void draw() { + drawAPI.drawCircle(radius, x, y); + } + } + ``` + + - 5、使用 Shape 和 DrawAPI 类画出不同颜色的圆。 + + ```java + // 画红圆 + Circle circle = new Circle(10, 10, 100, new RedCircle());s + circle.draw(); + // 画绿圆 + Circle circle2 = new Circle(20, 20, 100, new GreenCircle()); + circle2.draw(); + ``` + +### 16. 组合模式 +> 又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 + + - **主要解决**:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 + +以创建和打印员工的层次结构为例,最小单元示例: + + - 1、创建 Employee 类,该类带有 Employee 对象的列表。 + + ```java + public class Employee { + + private String name; + // 部门 + private String dept; + // 工资 + private int salary; + // 员工 list + private List subordinates; + + public Employee(String name, String dept, int salary) { + this.name = name; + this.dept = dept; + this.salary = salary; + this.subordinates = new ArrayList(); + } + + public void add(Employee e) { + subordinates.add(e); + } + + public void remove(Employee e) { + subordinates.remove(e); + } + + public List getSubordinates() { + return subordinates; + } + + @Override + public String toString() { + return "Employee{" + + "name='" + name + '\'' + + ", dept='" + dept + '\'' + + ", salary=" + salary + + ", subordinates=" + subordinates + + '}'; + } + } + ``` + + - 2.使用 Employee 类来创建和打印员工的层次结构。 + + ```java + final Employee ceo = new Employee("John", "CEO", 30000); + + Employee headSales = new Employee("Robert", "Head sales", 20000); + + Employee headMarketing = new Employee("Michel", "Head Marketing", 20000); + + Employee clerk1 = new Employee("Laura", "Marketing", 10000); + Employee clerk2 = new Employee("Bob", "Marketing", 10000); + + Employee salesExecutive1 = new Employee("Richard", "Sales", 10000); + Employee salesExecutive2 = new Employee("Rob", "Sales", 10000); + + ceo.add(headSales); + ceo.add(headMarketing); + + headSales.add(salesExecutive1); + headSales.add(salesExecutive2); + + headMarketing.add(clerk1); + headMarketing.add(clerk2); + + Log.e("---", ceo.toString()); + + // 打印 + /* + * Employee{name='John', dept='CEO', salary=30000, + * subordinates=[Employee{name='Robert', dept='Head sales', salary=20000, + * subordinates=[ + * Employee{name='Richard', dept='Sales', salary=10000, subordinates=[]}, + * Employee{name='Rob', dept='Sales', salary=10000, subordinates=[]}]}, + * Employee{name='Michel', dept='Head Marketing', salary=20000, + * subordinates=[Employee{name='Laura', dept='Marketing', salary=10000, subordinates=[]}, + * Employee{name='Bob', dept='Marketing', salary=10000, subordinates=[]}]}]} + */ + ``` + +### 17. 迭代器模式 +> Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。 + + - **主要解决**:不同的方式来遍历整个整合对象。 + +以使用迭代器打印名字为例,总共分三步: + + - 1、创建接口: + + ```java + public interface Iterator { + + public boolean hasNext(); + + public Object next(); + } + ``` + + ```java + public interface Container { + public Iterator getIterator(); + } + ``` + +- 2、创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator。 + + ```java + public class NameRepository implements Container { + + private String names[] = {"John", "jingbin", "youlookwhat", "lookthis"}; + + @Override + public Iterator getIterator() { + return new NameIterator(); + } + + private class NameIterator implements Iterator { + + int index; + + @Override + public boolean hasNext() { + if (index < names.length) { + return true; + } + return false; + } + + @Override + public Object next() { + if (hasNext()) { + return names[index++]; + } + return null; + } + } + + } + ``` + +- 3、使用 NameRepository 来获取迭代器,并打印名字。 + + ```java + NameRepository nameRepository = new NameRepository(); + for (Iterator iterator = nameRepository.getIterator(); iterator.hasNext(); ) { + String name = (String) iterator.next(); + Log.e("---", name); + /* + * /---: John + * /---: jingbin + * /---: youlookwhat + * /---: lookthis + */ + } + ``` + +### 18. 中介者模式 +> 用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 + + - **主要解决**:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。 + +以公共聊天室为例,最小单元示例步骤: + + - 1、创建中介类。 + + ```java + public class CharRoom { + public static void showMessage(User user, String message) { + Log.e("---", new Date().toString() + + " [" + user.getName() + "] : " + message); + } + } + ``` + + - 2、创建 user 类。 + + ```java + public class User { + private String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void sendMessage(String message) { + // 使用中介类 + CharRoom.showMessage(this, message); + } + } + ``` + + - 3、使用 User 对象来显示他们之间的通信。 + + ```java + User jingbin = new User("jingbin"); + jingbin.sendMessage("Hi~ youlookwhat!"); + //---: Sun Feb 02 08:11:47 GMT+00:00 2020 [jingbin] : Hi~ youlookwhat! + + User jingbin = new User("youlookwhat"); + jingbin.sendMessage("Hi~ jingbin!"); + //---: Sun Feb 02 08:11:49 GMT+00:00 2020 [youlookwhat] : Hi~ jingbin! + ``` + +### 19. 备忘录模式 +> 保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 + +- **主要解决**:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 + +以使用备忘录为例,最小单元步骤: + + - 1、创建 备忘录 Memento 类。 + + ```java + public class Memento { + + private String state; + + public Memento(String state) { + this.state = state; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + } + ``` + + - 2、创建 Originator 类。 + + ```java + public class Originator { + + private String state; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Memento setSateToMemento() { + return new Memento(state); + } + + public String getStateFromMemento(Memento memento) { + return memento.getState(); + } + } + ``` + + - 3、创建 CareTaker 类。 + + ```java + public class CareTaker { + + private List mementoList = new ArrayList(); + + public void add(Memento memento) { + mementoList.add(memento); + } + + public Memento get(int index) { + return mementoList.get(index); + } + } + ``` + + - 4、使用 CareTaker 和 Originator 对象。 + + ```java + // 管理者 + CareTaker careTaker = new CareTaker(); + + Originator originator = new Originator(); + originator.setState("State #1"); + originator.setState("State #2"); + + // 保存状态 + careTaker.add(originator.setSateToMemento()); + + originator.setState("State #3"); + + // 保存状态 + careTaker.add(originator.setSateToMemento()); + + originator.setState("State #4"); + + Log.e("---", "Current State: " + originator.getState()); + // 得到保存的状态 + String fromMemento1 = originator.getStateFromMemento(careTaker.get(0)); + Log.e("---", "First Saved State: " + fromMemento1); + String fromMemento2 = originator.getStateFromMemento(careTaker.get(1)); + Log.e("---", "Second Saved State: " + fromMemento2); + + /* + * /---: Current State: State #4 + * /---: First Saved State: State #2 + * /---: Second Saved State: State #3 + */ + ``` + +### 20. 解释器模式 +> 提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 + + - **主要解决**:对于一些固定文法构建一个解释句子的解释器。 + +以解释一句话为例,最小单元步骤: + + - 1、创建一个表达式接口 Expression。 + + ```java + public interface Expression { + public boolean interpreter(String content); + } + ``` + + - 2、创建实现了上述接口的实体类。TerminalExpression、OrExpression、AndExpression。 + + ```java + public class TerminalExpression implements Expression { + + private String data; + + public TerminalExpression(String data) { + this.data = data; + } + + @Override + public boolean interpreter(String content) { + // 是包含判断 + return content.contains(data); + } + } + ``` + + ```java + public class OrExpression implements Expression { + + private Expression expression1; + private Expression expression2; + + public OrExpression(Expression expression1, Expression expression2) { + this.expression1 = expression1; + this.expression2 = expression2; + } + + @Override + public boolean interpreter(String content) { + return expression1.interpreter(content) || expression2.interpreter(content); + } + } + ``` + + ```java + public class AndExpression implements Expression { + + private Expression expression1; + private Expression expression2; + + public AndExpression(Expression expression1, Expression expression2) { + this.expression1 = expression1; + this.expression2 = expression2; + } + + @Override + public boolean interpreter(String content) { + return expression1.interpreter(content) && expression2.interpreter(content); + } + } + ``` + + - 3、使用 Expression 类来创建规则,并解析它们。 + + ```java + /** + * 规则:jingbin 和 youlookwhat 是男性 + */ + public static Expression getMaleExpression() { + TerminalExpression jingbin = new TerminalExpression("jingbin"); + TerminalExpression youlookwhat = new TerminalExpression("youlookwhat"); + return new OrExpression(jingbin, youlookwhat); + } + + /** + * 规则:Julie 是一个已婚的女性 + */ + public static Expression getMarriedWomanExpression() { + TerminalExpression julie = new TerminalExpression("Julie"); + TerminalExpression married = new TerminalExpression("Married"); + return new AndExpression(julie, married); + } + + Expression maleExpression = getMaleExpression(); + // jingbin is male: true + Log.e("---", "jingbin is male: " + maleExpression.interpreter("jingbin")); + + Expression womanExpression = getMarriedWomanExpression(); + // Julie is married woman: true + Log.e("---", "Julie is married woman: " + womanExpression.interpreter("Married Julie")); + + ``` + + +### 21. 责任链模式 +> 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。**在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。** + + - **主要解决**:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 + +以Android Studio中打印日志为例,最小单元步骤: + + - 1、创建抽象的记录器类 AbstractLogger。 + + ```java + public abstract class AbstractLogger { + + public static int INFO = 1; + public static int DEBUG = 2; + public static int ERROR = 3; + + protected int level; + + // 责任链中的下一个元素 + protected AbstractLogger nextLogger; + + public void setNextLogger(AbstractLogger nextLogger) { + this.nextLogger = nextLogger; + } + + public void logMessage(int level, String message) { + if (this.level <= level) { + write(message); + } + // 递归效果,不断调用下一级 logMessage + if (nextLogger != null) { + nextLogger.logMessage(level, message); + } + } + + protected abstract void write(String message); + } + ``` + +- 2、创建扩展了该记录器类的实体类。 + + ```java + public class ConsoleLogger extends AbstractLogger { + + public ConsoleLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "Standard Console::Logger " + message); + } + } + ``` + + ```java + public class FileLogger extends AbstractLogger { + + public FileLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "File::Logger " + message); + } + } + ``` + + ```java + public class ErrorLogger extends AbstractLogger { + + public ErrorLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "Error Console::Logger " + message); + } + } + ``` + +- 3、创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。 + + ```java + public static AbstractLogger getChainOfLoggers() { + ErrorLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); + FileLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); + ConsoleLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO); + errorLogger.setNextLogger(fileLogger); + fileLogger.setNextLogger(consoleLogger); + return errorLogger; + } + + AbstractLogger logger = getChainOfLoggers(); + + // ---: Standard Console::Logger this is an information. + logger.logMessage(AbstractLogger.INFO, "this is an information."); + + // ---: File::Logger this is a debug level information. + // ---: Standard Console::Logger this is a debug level information. + logger.logMessage(AbstractLogger.DEBUG, "this is a debug level information."); + + // ---: Error Console::Logger this is a error level information. + // ---: File::Logger this is a error level information. + // ---: Standard Console::Logger this is a error level information. + logger.logMessage(AbstractLogger.ERROR, "this is a error level information."); + + ``` + +### 22. 访问者模式 +> 在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 + + - **主要解决**:稳定的数据结构和易变的操作耦合问题。 + +以显示计算机的组成部分为例,主要分五步实现: + + - 1、定义一个表示元素的接口。 + + ```java + public interface ComputerPart { + public void accept(ComputerPartVisitor computerPartVisitor); + } + ``` + + - 2、创建扩展了上述类的实体类。[Keyboard](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Keyboard.java)、[Monitor](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Monitor.java)、[Mouse](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Mouse.java)、[Computer](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Computer.java) + + ```java + public class Computer implements ComputerPart { + + private ComputerPart[] parts; + + public Computer() { + this.parts = new ComputerPart[]{new Mouse(), new Keyboard(), new Monitor()}; + } + + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + for (ComputerPart part : parts) { + part.accept(computerPartVisitor); + } + computerPartVisitor.visit(this); + } + } + ``` + + ```java + public class Mouse implements ComputerPart { + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + computerPartVisitor.visit(this); + } + } + ``` + + - 3、定义一个表示访问者的接口。 + + ```java + public interface ComputerPartVisitor { + + public void visit(Computer computer); + + public void visit(Mouse mouse); + + public void visit(Keyboard keyboard); + + public void visit(Monitor monitor); + } + ``` + + - 4、创建实现了上述类的实体访问者。 + + ```java + public class ComputerPartDisplayVisitor implements ComputerPartVisitor { + + @Override + public void visit(Computer computer) { + Log.e("---", "Displaying Computer."); + } + + @Override + public void visit(Mouse mouse) { + Log.e("---", "Displaying Mouse."); + } + + @Override + public void visit(Keyboard keyboard) { + Log.e("---", "Displaying Keyboard."); + } + + @Override + public void visit(Monitor monitor) { + Log.e("---", "Displaying Monitor."); + } + } + ``` + + - 5、使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。 + + ```java + ComputerPart computer = new Computer(); + computer.accept(new ComputerPartDisplayVisitor()); + /* + *打印: + *---: Displaying Mouse. + *---: Displaying Keyboard. + *---: Displaying Monitor. + *---: Displaying Computer. + */ + ``` + + ## Download - - [DesignPattern.apk](http://download.csdn.net/detail/jingbin_/9684545) + - [DesignPattern.apk](https://download.csdn.net/download/jingbin_/12146492) ## Reference - - [http://blog.csdn.net/lmj623565791/article/category/2206597](http://blog.csdn.net/lmj623565791/article/category/2206597) + - [CSDN:张鸿洋](http://blog.csdn.net/lmj623565791/article/category/2206597) + - [CSDN:dmk877](http://blog.csdn.net/dmk877/article/details/50311791) + - [菜鸟教程:设计模式](https://www.runoob.com/design-pattern/design-pattern-intro.html) -## Thanks -- [CSDN:张鸿洋](http://blog.csdn.net/lmj623565791) -- [CSDN:dmk877](http://blog.csdn.net/dmk877/article/details/50311791) +## About me + - **QQ:** 770413277 + - **掘金:**[https://juejin.im/user/56eec46d1ea49300555a176b/posts](https://juejin.im/user/56eec46d1ea49300555a176b/posts) + - **简书:**[https://www.jianshu.com/u/e43c6e979831](https://www.jianshu.com/u/e43c6e979831) + - **Email:** jingbin127@163.com diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c419263 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index eb475a9..2f72096 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,15 @@ apply plugin: 'com.android.application' + android { - compileSdkVersion 24 - buildToolsVersion "24.0.2" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { applicationId "com.example.jingbin.designpattern" minSdkVersion 19 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + targetSdkVersion 29 + versionCode 5 + versionName "3.1" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -16,16 +17,42 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + // databinding + dataBinding { + enabled = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + // 其他 designpattern + signingConfigs { + release { + storeFile file("./designpattern") + storePassword "designpattern" + keyAlias "designpattern" + keyPassword "designpattern" + } + debug { + storeFile file("./designpattern") + storePassword "designpattern" + keyAlias "designpattern" + keyPassword "designpattern" + } + } } -apply plugin: 'com.neenbedankt.android-apt'//增加这一句 + dependencies { - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:24.2.1' - testCompile 'junit:junit:4.12' - compile fileTree(include: ['*.jar'], dir: 'libs') - //增加这二句 - compile 'com.jakewharton:butterknife:8.4.0' - apt 'com.jakewharton:butterknife-compiler:8.4.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + testImplementation 'junit:junit:4.13.2' + implementation fileTree(include: ['*.jar'], dir: 'libs') + + implementation "com.github.youlookwhat:ByRecyclerView:1.3.2" + implementation 'androidx.recyclerview:recyclerview:1.2.1' } diff --git a/app/designpattern b/app/designpattern new file mode 100644 index 0000000..f1a400b Binary files /dev/null and b/app/designpattern differ diff --git a/app/src/androidTest/java/com/example/jingbin/designpattern/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/jingbin/designpattern/ExampleInstrumentedTest.java index ec37750..c3f8c80 100644 --- a/app/src/androidTest/java/com/example/jingbin/designpattern/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/example/jingbin/designpattern/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package com.example.jingbin.designpattern; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d3938c7..0b1aefd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,51 +1,45 @@ + android:theme="@style/AppTheme" + tools:ignore="GoogleAppIndexingWarning"> - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..ed45738 Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java index fa58191..ad9ca59 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java @@ -1,107 +1,129 @@ package com.example.jingbin.designpattern; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; -import android.widget.Button; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.GridLayoutManager; import com.example.jingbin.designpattern.adapter.AdapterActivity; +import com.example.jingbin.designpattern.bridge.BridgeActivity; +import com.example.jingbin.designpattern.builder.BuilderActivity; +import com.example.jingbin.designpattern.chainofresponsibility.ChainOfResponsibilityActivity; import com.example.jingbin.designpattern.command.CommandActivity; +import com.example.jingbin.designpattern.composite.CompositeActivity; +import com.example.jingbin.designpattern.databinding.ActivityMainBinding; import com.example.jingbin.designpattern.decorator.DecoratorActivity; import com.example.jingbin.designpattern.facade.FacadeActivity; import com.example.jingbin.designpattern.factory.FactoryActivity; +import com.example.jingbin.designpattern.flyweight.FlyweightActivity; +import com.example.jingbin.designpattern.interpreter.InterpreterActivity; +import com.example.jingbin.designpattern.iterator.IteratorActivity; +import com.example.jingbin.designpattern.mediator.MediatorActivity; +import com.example.jingbin.designpattern.memento.MementoActivity; import com.example.jingbin.designpattern.observer.ObserverActivity; +import com.example.jingbin.designpattern.prototype.PrototypeActivity; +import com.example.jingbin.designpattern.proxy.ProxyActivity; import com.example.jingbin.designpattern.singleton.SingletonActivity; import com.example.jingbin.designpattern.state.StateActivity; import com.example.jingbin.designpattern.strategy.StrategyActivity; import com.example.jingbin.designpattern.templatemethod.TemplateMethodActivity; +import com.example.jingbin.designpattern.visitor.VisitorActivity; + +import java.util.Arrays; -import butterknife.BindView; -import butterknife.ButterKnife; +import me.jingbin.library.ByRecyclerView; +import me.jingbin.library.adapter.BaseByViewHolder; +import me.jingbin.library.adapter.BaseRecyclerAdapter; +import me.jingbin.library.decoration.GridSpaceItemDecoration; /** * Created by jingbin on 2016/10/21. */ -public class MainActivity extends AppCompatActivity implements View.OnClickListener { +public class MainActivity extends AppCompatActivity { + + private ActivityMainBinding binding; + private String[] patterns = { + "观察者模式", "工厂模式", + "单例设计模式", "策略模式", + "适配器模式", "命令模式", + "装饰者模式", "外观模式", + "模板方法模式", "状态模式", + "建造者模式", "原型模式", + "享元模式", "代理模式", + "桥接模式", "组合模式", + "迭代器模式", "中介者模式", + "备忘录模式", "解释器模式", + "责任链模式", "访问者模式" + }; + private Class[] classes = { + ObserverActivity.class, FactoryActivity.class, + SingletonActivity.class, StrategyActivity.class, + AdapterActivity.class, CommandActivity.class, + DecoratorActivity.class, FacadeActivity.class, + TemplateMethodActivity.class, StateActivity.class, + BuilderActivity.class, PrototypeActivity.class, + FlyweightActivity.class, ProxyActivity.class, + BridgeActivity.class, CompositeActivity.class, + IteratorActivity.class, MediatorActivity.class, + MementoActivity.class, InterpreterActivity.class, + ChainOfResponsibilityActivity.class, VisitorActivity.class + }; - @BindView(R.id.bt_observer) - Button btObserver; - @BindView(R.id.bt_factory) - Button btFactory; - @BindView(R.id.bt_singleton) - Button btSingleton; - @BindView(R.id.bt_strategy) - Button btStrategy; - @BindView(R.id.bt_adapter) - Button btAdapter; - @BindView(R.id.bt_command) - Button btCommand; - @BindView(R.id.bt_decorator) - Button btDecorator; - @BindView(R.id.bt_facade) - Button btFacade; - @BindView(R.id.bt_template_method) - Button btTemplateMethod; - @BindView(R.id.bt_state) - Button btState; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - ButterKnife.bind(this); - initListener(); + binding = DataBindingUtil.setContentView(this, R.layout.activity_main); + initView(); } - private void initListener() { - btObserver.setOnClickListener(this); - btFactory.setOnClickListener(this); - btSingleton.setOnClickListener(this); - btStrategy.setOnClickListener(this); - btAdapter.setOnClickListener(this); - btCommand.setOnClickListener(this); - btDecorator.setOnClickListener(this); - btFacade.setOnClickListener(this); - btTemplateMethod.setOnClickListener(this); - btState.setOnClickListener(this); + private void initView() { + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); + binding.recyclerView.setLayoutManager(gridLayoutManager); + binding.recyclerView.addItemDecoration(new GridSpaceItemDecoration(10).setEndFromSize(0)); + binding.recyclerView.setAdapter(new BaseRecyclerAdapter(R.layout.item_main, Arrays.asList(patterns)) { + @Override + protected void bindView(BaseByViewHolder holder, String title, int position) { + holder.setText(R.id.bt_button, title); + } + }); + binding.recyclerView.setOnItemClickListener(new ByRecyclerView.OnItemClickListener() { + @Override + public void onClick(View v, int position) { + startActivity(new Intent(v.getContext(), classes[position])); + } + }); } @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.bt_observer:// 观察者模式 - startActivity(new Intent(this, ObserverActivity.class)); - break; - case R.id.bt_factory:// 工厂模式 - startActivity(new Intent(this, FactoryActivity.class)); - break; - case R.id.bt_singleton:// 单例设计模式 - startActivity(new Intent(this, SingletonActivity.class)); - break; - case R.id.bt_strategy:// 策略模式 - startActivity(new Intent(this, StrategyActivity.class)); - break; - case R.id.bt_adapter:// 适配器模式 - startActivity(new Intent(this, AdapterActivity.class)); - break; - case R.id.bt_command:// 命令模式 - startActivity(new Intent(this, CommandActivity.class)); - break; - case R.id.bt_decorator:// 装饰者模式 - startActivity(new Intent(this, DecoratorActivity.class)); - break; - case R.id.bt_facade:// 外观模式 - startActivity(new Intent(this, FacadeActivity.class)); - break; - case R.id.bt_template_method:// 模板方法模式 - startActivity(new Intent(this, TemplateMethodActivity.class)); - break; - case R.id.bt_state:// 状态模式 - startActivity(new Intent(this, StateActivity.class)); + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.actionbar_about: + Uri issuesUrl = Uri.parse("https://github.com/youlookwhat/DesignPattern"); + Intent intent = new Intent(Intent.ACTION_VIEW, issuesUrl); + startActivity(intent); break; default: break; } + return super.onOptionsItemSelected(item); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + binding.recyclerView.destroy(); } } diff --git a/app/src/main/java/com/example/jingbin/designpattern/adapter/AdapterActivity.java b/app/src/main/java/com/example/jingbin/designpattern/adapter/AdapterActivity.java index a31db3a..c59bac0 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/adapter/AdapterActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/adapter/AdapterActivity.java @@ -1,18 +1,15 @@ package com.example.jingbin.designpattern.adapter; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; - -import butterknife.BindView; -import butterknife.ButterKnife; +import com.example.jingbin.designpattern.databinding.ActivityAdapterBinding; /** * 适配器模式: @@ -22,25 +19,15 @@ */ public class AdapterActivity extends AppCompatActivity { - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_adapter) - LinearLayout activityAdapter; - @BindView(R.id.by_adapter) - Button byAdapter; - @BindView(R.id.bt_adapter_text) - Button btAdapterText; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_adapter); - ButterKnife.bind(this); + ActivityAdapterBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_adapter); setTitle("适配器模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.ADAPTER_DEFINE)); - btAdapterText.setText("将220V家用电转换为5V"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.ADAPTER_DEFINE)); + binding.btAdapterText.setText("将220V家用电转换为5V"); - btAdapterText.setOnClickListener(new View.OnClickListener() { + binding.btAdapterText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /** diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java index be3592a..8ec8822 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java +++ b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java @@ -13,9 +13,21 @@ public class AppConstant { public final static String COMMAND_DEFINE = "命令模式(Command Pattern)定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(简化: 将请求封装成对象,将动作请求者和动作执行者解耦。)"; public final static String DECORATOR_DEFINE = "装饰者模式(Decorator Pattern)定义:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。(先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。))"; public final static String FACADE_DEFINE = "外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。其实就是为了方便客户的使用,把一群操作,封装成一个方法。)"; - public final static String TEMPLATEMETHOD_DEFINE = "模板方法模式(Template Method Pattern)定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。(模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。)"; + public final static String TEMPLATE_METHOD_DEFINE = "模板方法模式(Template Method Pattern)定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。(模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。)"; + public final static String BUILDER_DEFINE = "建造者模式(Builder Pattern)建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。"; + public final static String PROTOTYPE_DEFINE = "原型模式(Prototype Pattern)定义:是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。"; + public final static String FLYWEIGHT_DEFINE = "享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。"; + public final static String PROXY_DEFINE = "代理模式(Proxy Pattern)一个类代表另一个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。"; public final static String JDGC_FACTORY_DEFINE = "简单工厂模式定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。"; public final static String GCFF_FACTORY_DEFINE = "工厂方法模式定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。"; public final static String CXGC_FACTORY_DEFINE = "抽象工厂模式定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。"; public final static String STATE_DEFINE = "状态模式定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的。"; + public final static String BRIDGE_DEFINE = "桥接模式(Bridge Pattern)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口[DrawAPI],使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。"; + public final static String COMPOSITE_DEFINE = "组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。"; + public final static String ITERATOR_DEFINE = "迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。主要解决:不同的方式来遍历整个整合对象。"; + public final static String MEDIATOR_DEFINE = "中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。"; + public final static String MEMENTO_DEFINE = "备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。"; + public final static String INTERPRETER_DEFINE = "解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。"; + public final static String CHAIN_OF_RESPONSIBILITY_DEFINE = "责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。\n\n 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。"; + public final static String VISITOR_DEFINE = "访问者模式(Visitor Pattern):在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。"; } diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java b/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java index 8b99c02..cf13c8d 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java +++ b/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java @@ -2,8 +2,6 @@ import android.app.Application; -import com.example.jingbin.designpattern.singleton.lanhan.SingletonLanHan; - /** * Created by jingbin on 2016/10/22. */ @@ -13,13 +11,6 @@ public class PatternApplication extends Application { private static PatternApplication patternApplication; public static PatternApplication getInstance() { - if (patternApplication == null) { - synchronized (PatternApplication.class) { - if (patternApplication == null) { - patternApplication = new PatternApplication(); - } - } - } return patternApplication; } diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/BridgeActivity.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/BridgeActivity.java new file mode 100644 index 0000000..188e4e6 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/BridgeActivity.java @@ -0,0 +1,48 @@ +package com.example.jingbin.designpattern.bridge; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityBridgeBinding; + +/** + * @author jingbin + * 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。 + * 这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 + *

+ * 这种模式涉及到一个作为桥接的接口[DrawAPI],使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 + */ +public class BridgeActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityBridgeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_bridge); + setTitle("桥接模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.BRIDGE_DEFINE)); + + binding.btRed.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 画红圆 + Circle circle = new Circle(10, 10, 100, new RedCircle()); + circle.draw(); + } + }); + + binding.btGreen.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 画绿圆 + Circle circle = new Circle(20, 20, 100, new GreenCircle()); + circle.draw(); + } + }); + } + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/Circle.java new file mode 100644 index 0000000..8d9e0c9 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/Circle.java @@ -0,0 +1,22 @@ +package com.example.jingbin.designpattern.bridge; + +/** + * Created by jingbin on 2020-02-01. + * 4. 创建实现了 Shape 接口的实体类。 + */ +public class Circle extends Shape { + + private int x, y, radius; + + protected Circle(int x, int y, int radius, DrawAPI drawAPI) { + super(drawAPI); + this.x = x; + this.y = y; + this.radius = radius; + } + + @Override + public void draw() { + drawAPI.drawCircle(radius, x, y); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/DrawAPI.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/DrawAPI.java new file mode 100644 index 0000000..a8bb204 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/DrawAPI.java @@ -0,0 +1,11 @@ +package com.example.jingbin.designpattern.bridge; + +/** + * Created by jingbin on 2020-02-01. + * 1. 创建桥接实现接口。 + */ +public interface DrawAPI { + + public void drawCircle(int radius, int x, int y); + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/GreenCircle.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/GreenCircle.java new file mode 100644 index 0000000..3194fd7 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/GreenCircle.java @@ -0,0 +1,15 @@ +package com.example.jingbin.designpattern.bridge; + +import android.util.Log; + +/** + * Created by jingbin on 2020-02-01. + */ +public class GreenCircle implements DrawAPI { + + @Override + public void drawCircle(int radius, int x, int y) { + Log.e("---", "Drawing Circle[ color: green, radius: " + + radius + ", x: " + x + ", y: " + y + "]"); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/RedCircle.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/RedCircle.java new file mode 100644 index 0000000..3332057 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/RedCircle.java @@ -0,0 +1,16 @@ +package com.example.jingbin.designpattern.bridge; + +import android.util.Log; + +/** + * Created by jingbin on 2020-02-01. + * 2. 创建实现了 DrawAPI 接口的实体桥接实现类。 + */ +public class RedCircle implements DrawAPI { + + @Override + public void drawCircle(int radius, int x, int y) { + Log.e("---", "Drawing Circle[ color: red, radius: " + + radius + ", x: " + x + ", y: " + y + "]"); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/bridge/Shape.java b/app/src/main/java/com/example/jingbin/designpattern/bridge/Shape.java new file mode 100644 index 0000000..d3e260c --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/bridge/Shape.java @@ -0,0 +1,16 @@ +package com.example.jingbin.designpattern.bridge; + +/** + * Created by jingbin on 2020-02-01. + * 3. 使用 DrawAPI 接口创建抽象类 Shape。 + */ +public abstract class Shape { + + protected DrawAPI drawAPI; + + protected Shape(DrawAPI drawAPI) { + this.drawAPI = drawAPI; + } + + public abstract void draw(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java new file mode 100644 index 0000000..8f14b0f --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java @@ -0,0 +1,12 @@ +package com.example.jingbin.designpattern.builder; + +/** + * Created by jingbin on 2020-01-31. + * 抽象建造者 + */ +public abstract class Builder { + + public abstract void setPart(String name, String type); + + public abstract Product getProduct(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java new file mode 100644 index 0000000..472cd4d --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java @@ -0,0 +1,59 @@ +package com.example.jingbin.designpattern.builder; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityBuilderBinding; + +/** + * @author jingbin + * 建造者模式(Builder Pattern) + * 建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来, + * 从而可以使一个建造过程生成具有不同的内部表象的产品对象。 + *

+ * Builder 类是关键,然后定义一个Builder实现类,再之后就是处理实现类的逻辑。 + *

+ * 优点: + * 1. 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中, + * 一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。 + * 2. 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成, + * 基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。 + * 总结: + * 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。 + * 一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。 + */ +public class BuilderActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityBuilderBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_builder); + setTitle("建造者模式"); + + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.BUILDER_DEFINE)); + + binding.btBuyAodi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Director director = new Director(); + Product product = director.getAProduct(); + product.showProduct(); + } + }); + + binding.btBuyBaoma.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Director director = new Director(); + Product product = director.getBProduct(); + product.showProduct(); + } + }); + } + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java b/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java new file mode 100644 index 0000000..9d0396b --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java @@ -0,0 +1,21 @@ +package com.example.jingbin.designpattern.builder; + +/** + * Created by jingbin on 2020-01-31. + * 具体建造者 + */ +public class ConcreteBuilder extends Builder { + + private Product product = new Product(); + + @Override + public void setPart(String name, String type) { + product.setName(name); + product.setType(type); + } + + @Override + public Product getProduct() { + return product; + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java new file mode 100644 index 0000000..d3cc2ff --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java @@ -0,0 +1,20 @@ +package com.example.jingbin.designpattern.builder; + +/** + * Created by jingbin on 2020-01-31. + * 导演类 + */ +public class Director { + + private Builder builder = new ConcreteBuilder(); + + public Product getAProduct() { + builder.setPart("奥迪汽车", "Q5"); + return builder.getProduct(); + } + + public Product getBProduct() { + builder.setPart("宝马汽车", "X7"); + return builder.getProduct(); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java new file mode 100644 index 0000000..f715383 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java @@ -0,0 +1,26 @@ +package com.example.jingbin.designpattern.builder; + +import android.util.Log; + +/** + * Created by jingbin on 2020-01-31. + * 产品类 + */ +public class Product { + + private String name; + private String type; + + public void showProduct() { + Log.e("---", "名称:" + name); + Log.e("---", "型号:" + type); + } + + public void setName(String name) { + this.name = name; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/AbstractLogger.java b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/AbstractLogger.java new file mode 100644 index 0000000..f3e7f93 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/AbstractLogger.java @@ -0,0 +1,33 @@ +package com.example.jingbin.designpattern.chainofresponsibility; + +/** + * Created by jingbin on 2020-02-03. + * 1. 创建抽象的记录器类。 + */ +public abstract class AbstractLogger { + + public static int INFO = 1; + public static int DEBUG = 2; + public static int ERROR = 3; + + protected int level; + + // 责任链中的下一个元素 + protected AbstractLogger nextLogger; + + public void setNextLogger(AbstractLogger nextLogger) { + this.nextLogger = nextLogger; + } + + public void logMessage(int level, String message) { + if (this.level <= level) { + write(message); + } + // 递归效果,不断调用下一级 logMessage + if (nextLogger != null) { + nextLogger.logMessage(level, message); + } + } + + protected abstract void write(String message); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/ChainOfResponsibilityActivity.java b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/ChainOfResponsibilityActivity.java new file mode 100644 index 0000000..33d01a8 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/ChainOfResponsibilityActivity.java @@ -0,0 +1,76 @@ +package com.example.jingbin.designpattern.chainofresponsibility; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.chainofresponsibility.impl.ConsoleLogger; +import com.example.jingbin.designpattern.chainofresponsibility.impl.ErrorLogger; +import com.example.jingbin.designpattern.chainofresponsibility.impl.FileLogger; +import com.example.jingbin.designpattern.databinding.ActivityChainOfResponsibilityBinding; + +/** + * @author jingbin + * 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。 + * 这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 + *

+ * 在这种模式中,通常每个接收者都包含对另一个接收者的引用。 + * 如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 + *

+ * 主要解决: + * 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可, + * 无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 + */ +public class ChainOfResponsibilityActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityChainOfResponsibilityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_chain_of_responsibility); + setTitle("责任链模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.CHAIN_OF_RESPONSIBILITY_DEFINE)); + + // 3. 创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。 + final AbstractLogger logger = getChainOfLoggers(); + binding.btInfo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // ---: Standard Console::Logger this is an information. + logger.logMessage(AbstractLogger.INFO, "this is an information."); + } + }); + binding.btDebug.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // ---: File::Logger this is a debug level information. + // ---: Standard Console::Logger this is a debug level information. + logger.logMessage(AbstractLogger.DEBUG, "this is a debug level information."); + } + }); + binding.btError.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // ---: Error Console::Logger this is a error level information. + // ---: File::Logger this is a error level information. + // ---: Standard Console::Logger this is a error level information. + logger.logMessage(AbstractLogger.ERROR, "this is a error level information."); + } + }); + + } + + public static AbstractLogger getChainOfLoggers() { + ErrorLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); + FileLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); + ConsoleLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO); + errorLogger.setNextLogger(fileLogger); + fileLogger.setNextLogger(consoleLogger); + return errorLogger; + } + + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ConsoleLogger.java b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ConsoleLogger.java new file mode 100644 index 0000000..d89252a --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ConsoleLogger.java @@ -0,0 +1,21 @@ +package com.example.jingbin.designpattern.chainofresponsibility.impl; + +import android.util.Log; + +import com.example.jingbin.designpattern.chainofresponsibility.AbstractLogger; + +/** + * Created by jingbin on 2020-02-03. + * 2. 创建扩展了该记录器类的实体类。 + */ +public class ConsoleLogger extends AbstractLogger { + + public ConsoleLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "Standard Console::Logger " + message); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ErrorLogger.java b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ErrorLogger.java new file mode 100644 index 0000000..0222f1d --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/ErrorLogger.java @@ -0,0 +1,20 @@ +package com.example.jingbin.designpattern.chainofresponsibility.impl; + +import android.util.Log; + +import com.example.jingbin.designpattern.chainofresponsibility.AbstractLogger; + +/** + * Created by jingbin on 2020-02-03. + */ +public class ErrorLogger extends AbstractLogger { + + public ErrorLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "Error Console::Logger " + message); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/FileLogger.java b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/FileLogger.java new file mode 100644 index 0000000..ab39093 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/chainofresponsibility/impl/FileLogger.java @@ -0,0 +1,20 @@ +package com.example.jingbin.designpattern.chainofresponsibility.impl; + +import android.util.Log; + +import com.example.jingbin.designpattern.chainofresponsibility.AbstractLogger; + +/** + * Created by jingbin on 2020-02-03. + */ +public class FileLogger extends AbstractLogger { + + public FileLogger(int level) { + this.level = level; + } + + @Override + protected void write(String message) { + Log.e("---", "File::Logger " + message); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/command/CommandActivity.java b/app/src/main/java/com/example/jingbin/designpattern/command/CommandActivity.java index d69f023..95378b1 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/command/CommandActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/command/CommandActivity.java @@ -1,18 +1,15 @@ package com.example.jingbin.designpattern.command; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; - -import butterknife.BindView; -import butterknife.ButterKnife; +import com.example.jingbin.designpattern.databinding.ActivityCommandBinding; /** * 命令模式: @@ -25,55 +22,30 @@ */ public class CommandActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_command) - LinearLayout activityCommand; - @BindView(R.id.bt_command) - Button btCommand; - @BindView(R.id.bt_zero) - Button btZero; - @BindView(R.id.bt_three) - Button btThree; - @BindView(R.id.bt_six) - Button btSix; - @BindView(R.id.bt_one) - Button btOne; - @BindView(R.id.bt_four) - Button btFour; - @BindView(R.id.bt_seven) - Button btSeven; - @BindView(R.id.bt_two) - Button btTwo; - @BindView(R.id.bt_five) - Button btFive; - @BindView(R.id.bt_no) - Button btNo; - private ControlPanel controlPanel; + private ActivityCommandBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_command); - ButterKnife.bind(this); + binding = DataBindingUtil.setContentView(this, R.layout.activity_command); setTitle("命令模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.COMMAND_DEFINE)); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.COMMAND_DEFINE)); setCommands(); initListener(); } private void initListener() { - btZero.setOnClickListener(this); - btOne.setOnClickListener(this); - btTwo.setOnClickListener(this); - btThree.setOnClickListener(this); - btFour.setOnClickListener(this); - btFive.setOnClickListener(this); - btSix.setOnClickListener(this); - btSeven.setOnClickListener(this); - btNo.setOnClickListener(this); + binding.btZero.setOnClickListener(this); + binding.btOne.setOnClickListener(this); + binding.btTwo.setOnClickListener(this); + binding.btThree.setOnClickListener(this); + binding.btFour.setOnClickListener(this); + binding.btFive.setOnClickListener(this); + binding.btSix.setOnClickListener(this); + binding.btSeven.setOnClickListener(this); + binding.btNo.setOnClickListener(this); } private void setCommands() { diff --git a/app/src/main/java/com/example/jingbin/designpattern/composite/CompositeActivity.java b/app/src/main/java/com/example/jingbin/designpattern/composite/CompositeActivity.java new file mode 100644 index 0000000..feb990e --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/composite/CompositeActivity.java @@ -0,0 +1,74 @@ +package com.example.jingbin.designpattern.composite; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityCompositeBinding; + +/** + * @author jingbin + * 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。 + * 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 + * 这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 + *

+ * 主要解决: + * 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念, + * 客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 + */ +public class CompositeActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityCompositeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_composite); + + setTitle("组合模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.COMPOSITE_DEFINE)); + + // 2. 使用 Employee 类来创建和打印员工的层次结构。 + final Employee ceo = new Employee("John", "CEO", 30000); + + Employee headSales = new Employee("Robert", "Head sales", 20000); + + Employee headMarketing = new Employee("Michel", "Head Marketing", 20000); + + Employee clerk1 = new Employee("Laura", "Marketing", 10000); + Employee clerk2 = new Employee("Bob", "Marketing", 10000); + + Employee salesExecutive1 = new Employee("Richard", "Sales", 10000); + Employee salesExecutive2 = new Employee("Rob", "Sales", 10000); + + ceo.add(headSales); + ceo.add(headMarketing); + + headSales.add(salesExecutive1); + headSales.add(salesExecutive2); + + headMarketing.add(clerk1); + headMarketing.add(clerk2); + + binding.btCeo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e("---", ceo.toString()); + /* + * Employee{name='John', dept='CEO', salary=30000, + * subordinates=[Employee{name='Robert', dept='Head sales', salary=20000, + * subordinates=[ + * Employee{name='Richard', dept='Sales', salary=10000, subordinates=[]}, + * Employee{name='Rob', dept='Sales', salary=10000, subordinates=[]}]}, + * Employee{name='Michel', dept='Head Marketing', salary=20000, + * subordinates=[Employee{name='Laura', dept='Marketing', salary=10000, subordinates=[]}, + * Employee{name='Bob', dept='Marketing', salary=10000, subordinates=[]}]}]} + */ + } + }); + + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/composite/Employee.java b/app/src/main/java/com/example/jingbin/designpattern/composite/Employee.java new file mode 100644 index 0000000..799564e --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/composite/Employee.java @@ -0,0 +1,48 @@ +package com.example.jingbin.designpattern.composite; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建 Employee 类,该类带有 Employee 对象的列表。 + */ +public class Employee { + + private String name; + // 部门 + private String dept; + // 工资 + private int salary; + // 员工 list + private List subordinates; + + public Employee(String name, String dept, int salary) { + this.name = name; + this.dept = dept; + this.salary = salary; + this.subordinates = new ArrayList(); + } + + public void add(Employee e) { + subordinates.add(e); + } + + public void remove(Employee e) { + subordinates.remove(e); + } + + public List getSubordinates() { + return subordinates; + } + + @Override + public String toString() { + return "Employee{" + + "name='" + name + '\'' + + ", dept='" + dept + '\'' + + ", salary=" + salary + + ", subordinates=" + subordinates + + '}'; + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/decorator/DecoratorActivity.java b/app/src/main/java/com/example/jingbin/designpattern/decorator/DecoratorActivity.java index 0d67dee..f312096 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/decorator/DecoratorActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/decorator/DecoratorActivity.java @@ -1,24 +1,21 @@ package com.example.jingbin.designpattern.decorator; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityDecoratorBinding; import com.example.jingbin.designpattern.decorator.equip.RingEquip; import com.example.jingbin.designpattern.decorator.equip.ShoeEquip; -import com.example.jingbin.designpattern.decorator.gem.BlueGemDecotator; -import com.example.jingbin.designpattern.decorator.gem.RedGemDecotator; -import com.example.jingbin.designpattern.decorator.gem.YellowGemDecotator; -import com.example.jingbin.designpattern.app.EMTagHandler; - -import butterknife.BindView; -import butterknife.ButterKnife; +import com.example.jingbin.designpattern.decorator.gem.BlueGemDecorator; +import com.example.jingbin.designpattern.decorator.gem.RedGemDecorator; +import com.example.jingbin.designpattern.decorator.gem.YellowGemDecorator; /** * 装饰者模式: @@ -33,31 +30,19 @@ */ public class DecoratorActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_decorator) - Button btDecorator; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_decorator) - LinearLayout activityDecorator; - @BindView(R.id.bt_demo1) - Button btDemo1; - @BindView(R.id.bt_demo2) - Button btDemo2; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_decorator); - ButterKnife.bind(this); + ActivityDecoratorBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_decorator); setTitle("装饰者模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.DECORATOR_DEFINE)); - btDemo1.setText("一个镶嵌2颗红宝石,1颗蓝宝石的靴子"); - btDemo2.setText("一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的戒指"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.DECORATOR_DEFINE)); + binding.btDemo1.setText("一个镶嵌2颗红宝石,1颗蓝宝石的靴子"); + binding.btDemo2.setText("一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的戒指"); - btDecorator.setOnClickListener(this); - btDemo1.setOnClickListener(this); - btDemo2.setOnClickListener(this); + binding.btDecorator.setOnClickListener(this); + binding.btDemo1.setOnClickListener(this); + binding.btDemo2.setOnClickListener(this); } @Override @@ -69,16 +54,16 @@ public void onClick(View v) { case R.id.bt_demo1: Log.e("---", "一个镶嵌2颗红宝石,1颗蓝宝石的靴子: "); - IEquip iEquip = new RedGemDecotator(new RedGemDecotator(new BlueGemDecotator(new ShoeEquip()))); + IEquip iEquip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip()))); Log.e("---", "攻击力:" + iEquip.caculateAttack()); Log.e("---", "描述语:" + iEquip.description()); break; case R.id.bt_demo2: Log.e("---", "一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的戒指: "); - RedGemDecotator redGemDecotator = new RedGemDecotator(new BlueGemDecotator(new YellowGemDecotator(new RingEquip()))); - Log.e("---", "攻击力:" + redGemDecotator.caculateAttack()); - Log.e("---", "描述语:" + redGemDecotator.description()); + RedGemDecorator redGemDecorator = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new RingEquip()))); + Log.e("---", "攻击力:" + redGemDecorator.caculateAttack()); + Log.e("---", "描述语:" + redGemDecorator.description()); break; default: break; diff --git a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecotator.java b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecorator.java similarity index 85% rename from app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecotator.java rename to app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecorator.java index 443d177..b198e0a 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecotator.java +++ b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/BlueGemDecorator.java @@ -9,11 +9,11 @@ * 这与武器等不同,它是可以累加的,而武器不能 */ -public class BlueGemDecotator implements IEuipDecotator { +public class BlueGemDecorator implements IEuipDecorator { private IEquip iEquip; - public BlueGemDecotator(IEquip iEquip) { + public BlueGemDecorator(IEquip iEquip) { this.iEquip = iEquip; } diff --git a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecotator.java b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecorator.java similarity index 79% rename from app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecotator.java rename to app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecorator.java index 10bf4f1..c472e02 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecotator.java +++ b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/IEuipDecorator.java @@ -7,6 +7,6 @@ * 装饰品的接口 */ -public interface IEuipDecotator extends IEquip { +public interface IEuipDecorator extends IEquip { } diff --git a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecotator.java b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecorator.java similarity index 85% rename from app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecotator.java rename to app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecorator.java index e0d33fb..9cd33ac 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecotator.java +++ b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/RedGemDecorator.java @@ -9,11 +9,11 @@ * 这与武器等不同,它是可以累加的,而武器不能 */ -public class RedGemDecotator implements IEuipDecotator { +public class RedGemDecorator implements IEuipDecorator { private IEquip iEquip; - public RedGemDecotator(IEquip iEquip) { + public RedGemDecorator(IEquip iEquip) { this.iEquip = iEquip; } diff --git a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecotator.java b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecorator.java similarity index 84% rename from app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecotator.java rename to app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecorator.java index a523d50..39f4a6e 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecotator.java +++ b/app/src/main/java/com/example/jingbin/designpattern/decorator/gem/YellowGemDecorator.java @@ -9,11 +9,11 @@ * 这与武器等不同,它是可以累加的,而武器不能 */ -public class YellowGemDecotator implements IEuipDecotator { +public class YellowGemDecorator implements IEuipDecorator { private IEquip iEquip; - public YellowGemDecotator(IEquip iEquip) { + public YellowGemDecorator(IEquip iEquip) { this.iEquip = iEquip; } diff --git a/app/src/main/java/com/example/jingbin/designpattern/facade/FacadeActivity.java b/app/src/main/java/com/example/jingbin/designpattern/facade/FacadeActivity.java index a0a6026..bb7c86f 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/facade/FacadeActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/facade/FacadeActivity.java @@ -1,14 +1,15 @@ package com.example.jingbin.designpattern.facade; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityFacadeBinding; import com.example.jingbin.designpattern.facade.device.Computer; import com.example.jingbin.designpattern.facade.device.Light; import com.example.jingbin.designpattern.facade.device.Player; @@ -16,9 +17,6 @@ import com.example.jingbin.designpattern.facade.device.Projector; import com.example.jingbin.designpattern.facade.theater.HomeTheaterFacade; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * 外观模式: * 定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。 @@ -39,28 +37,18 @@ */ public class FacadeActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_facade) - Button btFacade; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.bt_open) - Button btOpen; - @BindView(R.id.bt_close) - Button btClose; - private HomeTheaterFacade homeTheaterFacade; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_facade); - ButterKnife.bind(this); + ActivityFacadeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_facade); setTitle("外观模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.FACADE_DEFINE)); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.FACADE_DEFINE)); - btFacade.setOnClickListener(this); - btOpen.setOnClickListener(this); - btClose.setOnClickListener(this); + binding.btFacade.setOnClickListener(this); + binding.btOpen.setOnClickListener(this); + binding.btClose.setOnClickListener(this); } @Override diff --git a/app/src/main/java/com/example/jingbin/designpattern/factory/FactoryActivity.java b/app/src/main/java/com/example/jingbin/designpattern/factory/FactoryActivity.java index 670931e..6c1e0da 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/factory/FactoryActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/factory/FactoryActivity.java @@ -1,16 +1,16 @@ package com.example.jingbin.designpattern.factory; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityRoujiaMoStoreBinding; import com.example.jingbin.designpattern.factory.cxgc.XianRoujiaMoTeSeStore; import com.example.jingbin.designpattern.factory.cxgc.XianSimpleRoujiaMoTeSeFactory; import com.example.jingbin.designpattern.factory.gcff.XianRoujiaMoStore; @@ -18,9 +18,6 @@ import com.example.jingbin.designpattern.factory.jdgc.RoujiaMoStore; import com.example.jingbin.designpattern.factory.jdgc.SimpleRoujiaMoFactory; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * Created by jingbin on 2016/10/22. *

@@ -36,41 +33,25 @@ */ public class FactoryActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_simple_factory) - Button btSimpleFactory; - @BindView(R.id.bt_factory_method) - Button btFactoryMethod; - @BindView(R.id.bt_static_factory) - Button btStaticFactory; - @BindView(R.id.bt_abstract_factory) - Button btAbstractFactory; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_roujia_mo_store) - LinearLayout activityRoujiaMoStore; - @BindView(R.id.tv_define2) - TextView tvDefine2; - @BindView(R.id.tv_define3) - TextView tvDefine3; + private ActivityRoujiaMoStoreBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_roujia_mo_store); - ButterKnife.bind(this); + binding = DataBindingUtil.setContentView(this, R.layout.activity_roujia_mo_store); setTitle("工厂模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.JDGC_FACTORY_DEFINE)); - tvDefine2.setText(EMTagHandler.fromHtml(AppConstant.GCFF_FACTORY_DEFINE)); - tvDefine3.setText(EMTagHandler.fromHtml(AppConstant.CXGC_FACTORY_DEFINE)); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.JDGC_FACTORY_DEFINE)); + binding.tvDefine2.setText(EMTagHandler.fromHtml(AppConstant.GCFF_FACTORY_DEFINE)); + binding.tvDefine3.setText(EMTagHandler.fromHtml(AppConstant.CXGC_FACTORY_DEFINE)); initListener(); } private void initListener() { - btStaticFactory.setOnClickListener(this); - btSimpleFactory.setOnClickListener(this); - btFactoryMethod.setOnClickListener(this); - btAbstractFactory.setOnClickListener(this); + binding.btStaticFactory.setOnClickListener(this); + binding.btSimpleFactory.setOnClickListener(this); + binding.btFactoryMethod.setOnClickListener(this); + binding.btAbstractFactory.setOnClickListener(this); } @Override diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java new file mode 100644 index 0000000..775cf33 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java @@ -0,0 +1,37 @@ +package com.example.jingbin.designpattern.flyweight; + +import android.util.Log; + +/** + * Created by jingbin on 2020-02-01. + * 2. 创建实现接口的实体类。 + */ +public class Circle implements Shape { + + private String color; + private int x; + private int y; + private int radius; + + public Circle(String color) { + this.color = color; + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + public void setRadius(int radius) { + this.radius = radius; + } + + @Override + public void draw() { + Log.e("---", "Circle: Draw() [Color : " + color + + ", x : " + x + ", y :" + y + ", radius :" + radius); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java new file mode 100644 index 0000000..11fbfd5 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java @@ -0,0 +1,60 @@ +package com.example.jingbin.designpattern.flyweight; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityFlyweightBinding; + +/** + * @author jingbin + * 享元模式(Flyweight Pattern) + * 主要用于减少创建对象的数量,以减少内存占用和提高性能。 + * 这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 + */ +public class FlyweightActivity extends AppCompatActivity { + + private static final String color[] = {"Red", "Blue", "Yellow", "White", "Black"}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityFlyweightBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_flyweight); + setTitle("享元模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.FLYWEIGHT_DEFINE)); + + binding.btGetCircle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 4. 使用该工厂,通过传递颜色信息来获取实体类的对象。 + for (int i = 0; i < 20; i++) { + Circle circle = (Circle) ShapeFactory.getShape(getRandomColor()); + circle.setX(getRandomX()); + circle.setY(getRandomY()); + circle.setRadius(100); + circle.draw(); + } + } + }); + + } + + /** + * 0.0-1.0 * [1-6] + */ + private static String getRandomColor() { + return color[(int) (Math.random() * color.length)]; + } + + private static int getRandomX() { + return (int) (Math.random() * 100); + } + + private static int getRandomY() { + return (int) (Math.random() * 100); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java new file mode 100644 index 0000000..bb7a9df --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java @@ -0,0 +1,9 @@ +package com.example.jingbin.designpattern.flyweight; + +/** + * Created by jingbin on 2020-02-01. + * 1. 创建一个接口。 + */ +public interface Shape { + void draw(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java new file mode 100644 index 0000000..a0f97bf --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java @@ -0,0 +1,25 @@ +package com.example.jingbin.designpattern.flyweight; + +import android.util.Log; + +import java.util.HashMap; + +/** + * Created by jingbin on 2020-02-01. + * 3. 创建一个工厂,生成基于给定信息的实体类的对象。 + */ +public class ShapeFactory { + + private static final HashMap circleMap = new HashMap(); + + public static Shape getShape(String color) { + Shape shape = circleMap.get(color); + if (shape == null) { + shape = new Circle(color); + circleMap.put(color, shape); + Log.e("getShape", "Creating circle of color : " + color); + } + return shape; + } + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/interpreter/Expression.java b/app/src/main/java/com/example/jingbin/designpattern/interpreter/Expression.java new file mode 100644 index 0000000..ad36aed --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/interpreter/Expression.java @@ -0,0 +1,9 @@ +package com.example.jingbin.designpattern.interpreter; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建一个表达式接口。 + */ +public interface Expression { + public boolean interpreter(String content); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/interpreter/InterpreterActivity.java b/app/src/main/java/com/example/jingbin/designpattern/interpreter/InterpreterActivity.java new file mode 100644 index 0000000..99c191b --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/interpreter/InterpreterActivity.java @@ -0,0 +1,70 @@ +package com.example.jingbin.designpattern.interpreter; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityInterpreterBinding; +import com.example.jingbin.designpattern.interpreter.expressionimpl.AndExpression; +import com.example.jingbin.designpattern.interpreter.expressionimpl.OrExpression; +import com.example.jingbin.designpattern.interpreter.expressionimpl.TerminalExpression; + +/** + * @author jingbin + * 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。 + * 这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 + *

+ * 主要解决:对于一些固定文法构建一个解释句子的解释器。 + */ +public class InterpreterActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityInterpreterBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_interpreter); + setTitle("解释器模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.INTERPRETER_DEFINE)); + + // 3. InterpreterPatternDemo 使用 Expression 类来创建规则,并解析它们 + binding.btMan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Expression maleExpression = getMaleExpression(); + // jingbin is male: true + Log.e("---", "jingbin is male: " + maleExpression.interpreter("jingbin")); + } + }); + + binding.btMarriedWoman.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Expression womanExpression = getMarriedWomanExpression(); + // Julie is married woman: true + Log.e("---", "Julie is married woman: " + womanExpression.interpreter("Married Julie")); + } + }); + } + + /** + * 规则:jingbin 和 youlookwhat 是男性 + */ + public static Expression getMaleExpression() { + TerminalExpression jingbin = new TerminalExpression("jingbin"); + TerminalExpression youlookwhat = new TerminalExpression("youlookwhat"); + return new OrExpression(jingbin, youlookwhat); + } + + /** + * 规则:Julie 是一个已婚的女性 + */ + public static Expression getMarriedWomanExpression() { + TerminalExpression julie = new TerminalExpression("Julie"); + TerminalExpression married = new TerminalExpression("Married"); + return new AndExpression(julie, married); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/AndExpression.java b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/AndExpression.java new file mode 100644 index 0000000..f5f3e04 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/AndExpression.java @@ -0,0 +1,23 @@ +package com.example.jingbin.designpattern.interpreter.expressionimpl; + +import com.example.jingbin.designpattern.interpreter.Expression; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建实现了上述接口的实体类。 + */ +public class AndExpression implements Expression { + + private Expression expression1; + private Expression expression2; + + public AndExpression(Expression expression1, Expression expression2) { + this.expression1 = expression1; + this.expression2 = expression2; + } + + @Override + public boolean interpreter(String content) { + return expression1.interpreter(content) && expression2.interpreter(content); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/OrExpression.java b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/OrExpression.java new file mode 100644 index 0000000..7b428ee --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/OrExpression.java @@ -0,0 +1,23 @@ +package com.example.jingbin.designpattern.interpreter.expressionimpl; + +import com.example.jingbin.designpattern.interpreter.Expression; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建实现了上述接口的实体类。 + */ +public class OrExpression implements Expression { + + private Expression expression1; + private Expression expression2; + + public OrExpression(Expression expression1, Expression expression2) { + this.expression1 = expression1; + this.expression2 = expression2; + } + + @Override + public boolean interpreter(String content) { + return expression1.interpreter(content) || expression2.interpreter(content); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/TerminalExpression.java b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/TerminalExpression.java new file mode 100644 index 0000000..e244543 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/interpreter/expressionimpl/TerminalExpression.java @@ -0,0 +1,21 @@ +package com.example.jingbin.designpattern.interpreter.expressionimpl; + +import com.example.jingbin.designpattern.interpreter.Expression; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建实现了上述接口的实体类。 + */ +public class TerminalExpression implements Expression { + + private String data; + + public TerminalExpression(String data) { + this.data = data; + } + + @Override + public boolean interpreter(String content) { + return content.contains(data); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/iterator/Container.java b/app/src/main/java/com/example/jingbin/designpattern/iterator/Container.java new file mode 100644 index 0000000..ce0c950 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/iterator/Container.java @@ -0,0 +1,9 @@ +package com.example.jingbin.designpattern.iterator; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建接口: + */ +public interface Container { + public Iterator getIterator(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/iterator/Iterator.java b/app/src/main/java/com/example/jingbin/designpattern/iterator/Iterator.java new file mode 100644 index 0000000..405e2d9 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/iterator/Iterator.java @@ -0,0 +1,12 @@ +package com.example.jingbin.designpattern.iterator; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建接口: + */ +public interface Iterator { + + public boolean hasNext(); + + public Object next(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/iterator/IteratorActivity.java b/app/src/main/java/com/example/jingbin/designpattern/iterator/IteratorActivity.java new file mode 100644 index 0000000..654a89f --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/iterator/IteratorActivity.java @@ -0,0 +1,48 @@ +package com.example.jingbin.designpattern.iterator; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityIteratorBinding; + +/** + * @author jingbin + * 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。 + * 这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 + *

+ * 主要解决:不同的方式来遍历整个整合对象。 + */ +public class IteratorActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityIteratorBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_iterator); + setTitle("迭代器模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.ITERATOR_DEFINE)); + + binding.btPlName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //3. 使用 NameRepository 来获取迭代器,并打印名字。 + NameRepository nameRepository = new NameRepository(); + for (Iterator iterator = nameRepository.getIterator(); iterator.hasNext(); ) { + String name = (String) iterator.next(); + Log.e("---", name); + /* + * /---: John + * /---: jingbin + * /---: youlookwhat + * /---: lookthis + */ + } + } + }); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/iterator/NameRepository.java b/app/src/main/java/com/example/jingbin/designpattern/iterator/NameRepository.java new file mode 100644 index 0000000..86d1b48 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/iterator/NameRepository.java @@ -0,0 +1,37 @@ +package com.example.jingbin.designpattern.iterator; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator。 + */ +public class NameRepository implements Container { + + private String names[] = {"John", "jingbin", "youlookwhat", "lookthis"}; + + @Override + public Iterator getIterator() { + return new NameIterator(); + } + + private class NameIterator implements Iterator { + + int index; + + @Override + public boolean hasNext() { + if (index < names.length) { + return true; + } + return false; + } + + @Override + public Object next() { + if (hasNext()) { + return names[index++]; + } + return null; + } + } + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/mediator/CharRoom.java b/app/src/main/java/com/example/jingbin/designpattern/mediator/CharRoom.java new file mode 100644 index 0000000..c6434d9 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/mediator/CharRoom.java @@ -0,0 +1,16 @@ +package com.example.jingbin.designpattern.mediator; + +import android.util.Log; + +import java.util.Date; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建中介类。 + */ +public class CharRoom { + public static void showMessage(User user, String message) { + Log.e("---", new Date().toString() + + " [" + user.getName() + "] : " + message); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/mediator/MediatorActivity.java b/app/src/main/java/com/example/jingbin/designpattern/mediator/MediatorActivity.java new file mode 100644 index 0000000..a54aa78 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/mediator/MediatorActivity.java @@ -0,0 +1,49 @@ +package com.example.jingbin.designpattern.mediator; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityMediatorBinding; + +/** + * @author jingbin + * 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。 + * 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。 + * 中介者模式属于行为型模式。 + *

+ * 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂, + * 同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。 + */ +public class MediatorActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityMediatorBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_mediator); + setTitle("中介者模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.MEDIATOR_DEFINE)); + + // 使用 User 对象来显示他们之间的通信。 + binding.btUser1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + User jingbin = new User("jingbin"); + jingbin.sendMessage("Hi~ youlookwhat!"); + //---: Sun Feb 02 08:11:47 GMT+00:00 2020 [jingbin] : Hi~ youlookwhat! + } + }); + binding.btUser2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + User jingbin = new User("youlookwhat"); + jingbin.sendMessage("Hi~ jingbin!"); + //---: Sun Feb 02 08:11:49 GMT+00:00 2020 [youlookwhat] : Hi~ jingbin! + } + }); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/mediator/User.java b/app/src/main/java/com/example/jingbin/designpattern/mediator/User.java new file mode 100644 index 0000000..57e49bd --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/mediator/User.java @@ -0,0 +1,25 @@ +package com.example.jingbin.designpattern.mediator; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建 user 类。 + */ +public class User { + private String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void sendMessage(String message) { + CharRoom.showMessage(this, message); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/memento/CareTaker.java b/app/src/main/java/com/example/jingbin/designpattern/memento/CareTaker.java new file mode 100644 index 0000000..736257c --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/memento/CareTaker.java @@ -0,0 +1,21 @@ +package com.example.jingbin.designpattern.memento; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jingbin on 2020-02-02. + * 3. 创建 CareTaker 类。 管理员 + */ +public class CareTaker { + + private List mementoList = new ArrayList(); + + public void add(Memento memento) { + mementoList.add(memento); + } + + public Memento get(int index) { + return mementoList.get(index); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/memento/Memento.java b/app/src/main/java/com/example/jingbin/designpattern/memento/Memento.java new file mode 100644 index 0000000..93c1341 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/memento/Memento.java @@ -0,0 +1,22 @@ +package com.example.jingbin.designpattern.memento; + +/** + * Created by jingbin on 2020-02-02. + * 1. 创建 Memento 类。备忘录 + */ +public class Memento { + + private String state; + + public Memento(String state) { + this.state = state; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/memento/MementoActivity.java b/app/src/main/java/com/example/jingbin/designpattern/memento/MementoActivity.java new file mode 100644 index 0000000..6243645 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/memento/MementoActivity.java @@ -0,0 +1,67 @@ +package com.example.jingbin.designpattern.memento; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityMementoBinding; + +/** + * @author jingbin + * 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 + *

+ * 主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态, + * 并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 + */ +public class MementoActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityMementoBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_memento); + setTitle("备忘录模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.MEMENTO_DEFINE)); + + // 4. 使用 CareTaker 和 Originator 对象。 + binding.btUseMemento.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 管理者 + CareTaker careTaker = new CareTaker(); + + Originator originator = new Originator(); + originator.setState("State #1"); + originator.setState("State #2"); + + // 保存状态 + careTaker.add(originator.setSateToMemento()); + + originator.setState("State #3"); + + // 保存状态 + careTaker.add(originator.setSateToMemento()); + + originator.setState("State #4"); + + Log.e("---", "Current State: " + originator.getState()); + // 得到保存的状态 + String fromMemento1 = originator.getStateFromMemento(careTaker.get(0)); + Log.e("---", "First Saved State: " + fromMemento1); + String fromMemento2 = originator.getStateFromMemento(careTaker.get(1)); + Log.e("---", "Second Saved State: " + fromMemento2); + + /* + * /---: Current State: State #4 + * /---: First Saved State: State #2 + * /---: Second Saved State: State #3 + */ + } + }); + + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/memento/Originator.java b/app/src/main/java/com/example/jingbin/designpattern/memento/Originator.java new file mode 100644 index 0000000..f38f139 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/memento/Originator.java @@ -0,0 +1,26 @@ +package com.example.jingbin.designpattern.memento; + +/** + * Created by jingbin on 2020-02-02. + * 2. 创建 Originator 类。发件人/发起人 + */ +public class Originator { + + private String state; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Memento setSateToMemento() { + return new Memento(state); + } + + public String getStateFromMemento(Memento memento) { + return memento.getState(); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java b/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java index ee5d8fa..77abcb2 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java @@ -1,15 +1,15 @@ package com.example.jingbin.designpattern.observer; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityObserverBinding; import com.example.jingbin.designpattern.observer.classs.ObjectFor3D; import com.example.jingbin.designpattern.observer.classs.ObserverUser1; import com.example.jingbin.designpattern.observer.classs.ObserverUser2; @@ -17,9 +17,6 @@ import com.example.jingbin.designpattern.observer.javautil.SubjectFor3d; import com.example.jingbin.designpattern.observer.javautil.SubjectForSSQ; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * 可以看出,使用Java内置的类实现观察者模式,代码非常简洁, * 对了addObserver,removeObserver,notifyObservers都已经为我们实现了, @@ -34,17 +31,6 @@ */ public class ObserverActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.bt_observer) - Button btObserver; - @BindView(R.id.bt_myself) - Button btMyself; - @BindView(R.id.bt_system) - Button btSystem; - @BindView(R.id.activity_observer) - LinearLayout activityObserver; - private ObjectFor3D objectFor3D; private ObserverUser1 observerUser1; private ObserverUser2 observerUser2; @@ -52,13 +38,12 @@ public class ObserverActivity extends AppCompatActivity implements View.OnClickL @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_observer); - ButterKnife.bind(this); + ActivityObserverBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_observer); setTitle("观察者模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.OBSERVER_DEFINE)); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.OBSERVER_DEFINE)); - btMyself.setOnClickListener(this); - btSystem.setOnClickListener(this); + binding.btMyself.setOnClickListener(this); + binding.btSystem.setOnClickListener(this); } diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java new file mode 100644 index 0000000..c4e4b34 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java @@ -0,0 +1,64 @@ +package com.example.jingbin.designpattern.prototype; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityPrototypeBinding; + +/** + * @author jingbin + * 原型模式(Prototype Pattern) + * 是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 + * 使用场景: + * 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 + * 例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 + * 步骤: + * 1. 创建一个实现了 Cloneable 接口的抽象类。Shape(implements Cloneable) + * 2. 创建扩展了上面抽象类的实体类。Circle Rectangle Square + * 3. 创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。ShapeCache + * 4. 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。 + */ +public class PrototypeActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityPrototypeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_prototype); + setTitle("原型模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.PROTOTYPE_DEFINE)); + + // 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。 + ShapeCache.loadCache(); + + binding.btCircle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Shape shapeCache = ShapeCache.getShape("1"); + Log.e("Prototype", "Shape: " + shapeCache.type); + } + }); + + binding.btRectangle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Shape shapeCache = ShapeCache.getShape("2"); + Log.e("Prototype", "Shape: " + shapeCache.type); + } + }); + + binding.btSquare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Shape shapeCache = ShapeCache.getShape("3"); + Log.e("Prototype", "Shape: " + shapeCache.type); + } + }); + + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java new file mode 100644 index 0000000..6bcda2c --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java @@ -0,0 +1,34 @@ +package com.example.jingbin.designpattern.prototype; + +import android.util.Log; + +/** + * Created by jingbin on 2020-01-31. + * 1. 创建一个实现了 Cloneable 接口的抽象类。 + */ +public abstract class Shape implements Cloneable { + + private String id; + protected String type; + + public abstract void draw(); + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public Object clone() { + Object object = null; + try { + object = super.clone(); + } catch (CloneNotSupportedException e) { + Log.e("--", e.getMessage()); + } + return object; + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java new file mode 100644 index 0000000..ada4dfb --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java @@ -0,0 +1,38 @@ +package com.example.jingbin.designpattern.prototype; + +import com.example.jingbin.designpattern.prototype.shapeimpl.Circle; +import com.example.jingbin.designpattern.prototype.shapeimpl.Rectangle; +import com.example.jingbin.designpattern.prototype.shapeimpl.Square; + +import java.util.Hashtable; + +/** + * Created by jingbin on 2020-01-31. + * 3. 创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。 + */ +public class ShapeCache { + + private static Hashtable shapeMap = new Hashtable(); + + public static Shape getShape(String shapeId) { + Shape shapeCache = shapeMap.get(shapeId); + return (Shape) shapeCache.clone(); + } + + // 对每种形状都运行数据库查询,并创建该形状 + // shapeMap.put(shapeKey, shape); + // 例如,我们要添加三种形状 + public static void loadCache() { + Circle circle = new Circle(); + circle.setId("1"); + shapeMap.put(circle.getId(), circle); + + Rectangle rectangle = new Rectangle(); + rectangle.setId("2"); + shapeMap.put(rectangle.getId(), rectangle); + + Square square = new Square(); + square.setId("3"); + shapeMap.put(square.getId(), square); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java new file mode 100644 index 0000000..abaf3ea --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java @@ -0,0 +1,22 @@ +package com.example.jingbin.designpattern.prototype.shapeimpl; + +import android.util.Log; + +import com.example.jingbin.designpattern.prototype.Shape; + +/** + * Created by jingbin on 2020-01-31. + * 2. 创建扩展了上面抽象类的实体类。Circle 圆形 + */ +public class Circle extends Shape { + + public Circle() { + type = "Circle"; + } + + @Override + public void draw() { + Log.e("---", "Inside Circle::draw() method."); + } + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java new file mode 100644 index 0000000..3d7df46 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java @@ -0,0 +1,23 @@ +package com.example.jingbin.designpattern.prototype.shapeimpl; + +import android.util.Log; + +import com.example.jingbin.designpattern.prototype.Shape; + +/** + * Created by jingbin on 2020-01-31. + * 2. 创建扩展了上面抽象类的实体类。Rectangle 矩形 + */ +public class Rectangle extends Shape { + + public Rectangle() { + type = "Rectangle"; + } + + @Override + public void draw() { + Log.e("---", "Inside Rectangle::draw() method."); + } + + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java new file mode 100644 index 0000000..ddda598 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java @@ -0,0 +1,23 @@ +package com.example.jingbin.designpattern.prototype.shapeimpl; + +import android.util.Log; + +import com.example.jingbin.designpattern.prototype.Shape; + +/** + * Created by jingbin on 2020-01-31. + * 2. 创建扩展了上面抽象类的实体类。Square 正方形 + */ +public class Square extends Shape { + + public Square() { + type = "Square"; + } + + @Override + public void draw() { + Log.e("---", "Inside Square::draw() method."); + } + + +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/proxy/Image.java b/app/src/main/java/com/example/jingbin/designpattern/proxy/Image.java new file mode 100644 index 0000000..9bb93d4 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/proxy/Image.java @@ -0,0 +1,9 @@ +package com.example.jingbin.designpattern.proxy; + +/** + * Created by jingbin on 2020-02-01. + * 1. 创建一个接口。 + */ +public interface Image { + void display(); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyActivity.java b/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyActivity.java new file mode 100644 index 0000000..03aaaed --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyActivity.java @@ -0,0 +1,53 @@ +package com.example.jingbin.designpattern.proxy; + +import android.os.Bundle; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityProxyBinding; + +/** + * @author jingbin + * 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 + *

+ * 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 + * 意图:为其他对象提供一种代理以控制对这个对象的访问。 + *

+ * 主要解决:在直接访问对象时带来的问题, + * 比如说:要访问的对象在远程的机器上。 + * 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问), + * 直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。 + */ +public class ProxyActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityProxyBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_proxy); + + setTitle("代理模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.PROXY_DEFINE)); + + // 3. 当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。 + final Image image = new ProxyImage("test_10mb.png"); + binding.btDisk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 第一次是new的,图像从磁盘加载 + image.display(); + } + }); + binding.btNoDisk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 第二次取缓存,图像不需要从磁盘加载 + image.display(); + } + }); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyImage.java b/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyImage.java new file mode 100644 index 0000000..dedba40 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/proxy/ProxyImage.java @@ -0,0 +1,23 @@ +package com.example.jingbin.designpattern.proxy; + +/** + * Created by jingbin on 2020-02-01. + * 2. 创建实现接口的实体类。 + */ +public class ProxyImage implements Image { + + private String fileName; + private RealImage realImage; + + public ProxyImage(String fileName) { + this.fileName = fileName; + } + + @Override + public void display() { + if (realImage == null) { + realImage = new RealImage(fileName); + } + realImage.display(); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/proxy/RealImage.java b/app/src/main/java/com/example/jingbin/designpattern/proxy/RealImage.java new file mode 100644 index 0000000..096ac1e --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/proxy/RealImage.java @@ -0,0 +1,26 @@ +package com.example.jingbin.designpattern.proxy; + +import android.util.Log; + +/** + * Created by jingbin on 2020-02-01. + * 2. 创建实现接口的实体类。 + */ +public class RealImage implements Image { + + private String fileName; + + public RealImage(String fileName) { + this.fileName = fileName; + loadFromDisk(fileName); + } + + private void loadFromDisk(String fileName) { + Log.e("RealImage", "loading " + fileName); + } + + @Override + public void display() { + Log.e("RealImage", "Displaying " + fileName); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/singleton/SingletonActivity.java b/app/src/main/java/com/example/jingbin/designpattern/singleton/SingletonActivity.java index 49efd3d..ccbaba6 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/singleton/SingletonActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/singleton/SingletonActivity.java @@ -1,50 +1,33 @@ package com.example.jingbin.designpattern.singleton; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivitySingletonBinding; import com.example.jingbin.designpattern.singleton.ehan.SingletonEHan; import com.example.jingbin.designpattern.singleton.enums.SingletonEnum; import com.example.jingbin.designpattern.singleton.inclass.SingletonIn; import com.example.jingbin.designpattern.singleton.lanhan.SingletonLanHan; -import butterknife.BindView; -import butterknife.ButterKnife; - public class SingletonActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_ehan) - Button btEhan; - @BindView(R.id.bt_lanhan) - Button btLanhan; - @BindView(R.id.bt_inclass) - Button btInclass; - @BindView(R.id.bt_enum) - Button btEnum; - @BindView(R.id.activity_singleton) - LinearLayout activitySingleton; - @BindView(R.id.tv_define) - TextView tvDefine; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_singleton); - ButterKnife.bind(this); + ActivitySingletonBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_singleton); setTitle("单例设计模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.SINGLETON_DEFINE)); - btEhan.setOnClickListener(this); - btLanhan.setOnClickListener(this); - btInclass.setOnClickListener(this); - btEnum.setOnClickListener(this); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.SINGLETON_DEFINE)); + binding.btEhan.setOnClickListener(this); + binding.btLanhan.setOnClickListener(this); + binding.btInclass.setOnClickListener(this); + binding.btEnum.setOnClickListener(this); } @Override diff --git a/app/src/main/java/com/example/jingbin/designpattern/state/StateActivity.java b/app/src/main/java/com/example/jingbin/designpattern/state/StateActivity.java index 252fad0..7903e9e 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/state/StateActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/state/StateActivity.java @@ -1,22 +1,19 @@ package com.example.jingbin.designpattern.state; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityStateBinding; import com.example.jingbin.designpattern.state.better.VendingMachineBetter; import com.example.jingbin.designpattern.state.old.VendingMachine; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * 状态模式 * 定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 @@ -24,30 +21,18 @@ */ public class StateActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_facade) - Button btFacade; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_state) - LinearLayout activityState; - @BindView(R.id.bt_facade_old) - Button btFacadeOld; - @BindView(R.id.bt_facade_better) - Button btFacadeBetter; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_state); - ButterKnife.bind(this); + ActivityStateBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_state); setTitle("状态模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.STATE_DEFINE)); - btFacadeOld.setText("最初实现待改进"); - btFacadeBetter.setText("改进过的售货机"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.STATE_DEFINE)); + binding.btFacadeOld.setText("最初实现待改进"); + binding.btFacadeBetter.setText("改进过的售货机"); - btFacadeOld.setOnClickListener(this); - btFacadeBetter.setOnClickListener(this); + binding.btFacadeOld.setOnClickListener(this); + binding.btFacadeBetter.setOnClickListener(this); } @Override @@ -73,7 +58,7 @@ public void onClick(View v) { vendingMachine.backMoney(); vendingMachine.turnCrank(); break; - + case R.id.bt_facade_better:// 改进过的售货机 VendingMachineBetter machineBetter = new VendingMachineBetter(4); // machineBetter.dispense();无法直接操作 出商品(出商品是自动的); diff --git a/app/src/main/java/com/example/jingbin/designpattern/strategy/StrategyActivity.java b/app/src/main/java/com/example/jingbin/designpattern/strategy/StrategyActivity.java index c3bddbe..02e2564 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/strategy/StrategyActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/strategy/StrategyActivity.java @@ -1,51 +1,38 @@ package com.example.jingbin.designpattern.strategy; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityStategyBinding; import com.example.jingbin.designpattern.strategy.better.AttackXL; import com.example.jingbin.designpattern.strategy.better.DefendTMS; import com.example.jingbin.designpattern.strategy.better.DisplayYZ; import com.example.jingbin.designpattern.strategy.better.RoleA; import com.example.jingbin.designpattern.strategy.better.RunJCTQ; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * 策略模式(Strategy Pattern):定义了算法族,分别封装起来, * 让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。 */ public class StrategyActivity extends AppCompatActivity { - @BindView(R.id.bt_strategy) - Button btStrategy; - @BindView(R.id.activity_stategy) - LinearLayout activityStategy; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.bt_strategy_text) - Button btStrategyText; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_stategy); - ButterKnife.bind(this); + ActivityStategyBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_stategy); setTitle("策略模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.STRATEGY_DEFINE)); - btStrategyText.setText("创建角色A,并设定样子,攻击,逃跑,防御"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.STRATEGY_DEFINE)); + binding.btStrategyText.setText("创建角色A,并设定样子,攻击,逃跑,防御"); - btStrategyText.setOnClickListener(new View.OnClickListener() { + binding.btStrategyText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RoleA roleA = new RoleA("---A"); diff --git a/app/src/main/java/com/example/jingbin/designpattern/templatemethod/TemplateMethodActivity.java b/app/src/main/java/com/example/jingbin/designpattern/templatemethod/TemplateMethodActivity.java index 34bb3e2..f35210d 100644 --- a/app/src/main/java/com/example/jingbin/designpattern/templatemethod/TemplateMethodActivity.java +++ b/app/src/main/java/com/example/jingbin/designpattern/templatemethod/TemplateMethodActivity.java @@ -1,24 +1,21 @@ package com.example.jingbin.designpattern.templatemethod; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; import com.example.jingbin.designpattern.R; import com.example.jingbin.designpattern.app.AppConstant; import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityTemplateMethodBinding; import com.example.jingbin.designpattern.templatemethod.worker.CTOWorker; import com.example.jingbin.designpattern.templatemethod.worker.HRWorker; import com.example.jingbin.designpattern.templatemethod.worker.ITWorker; import com.example.jingbin.designpattern.templatemethod.worker.OtherWorker; import com.example.jingbin.designpattern.templatemethod.worker.QAWorker; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * 模版方法模式 展现程序员的一天 * 定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。 @@ -29,29 +26,17 @@ */ public class TemplateMethodActivity extends AppCompatActivity implements View.OnClickListener { - @BindView(R.id.bt_template_method) - Button btTemplateMethod; - @BindView(R.id.bt_template_method_text) - Button btTemplateMethodText; - @BindView(R.id.tv_define) - TextView tvDefine; - @BindView(R.id.activity_template_method) - LinearLayout activityTemplateMethod; - @BindView(R.id.bt_template_method_text2) - Button btTemplateMethodText2; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_template_method); - ButterKnife.bind(this); + ActivityTemplateMethodBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_template_method); setTitle("模板方法模式"); - tvDefine.setText(EMTagHandler.fromHtml(AppConstant.TEMPLATEMETHOD_DEFINE)); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.TEMPLATE_METHOD_DEFINE)); - btTemplateMethodText.setText("查看所有人员的工作情况"); - btTemplateMethodText2.setText("查看程序猿离开公司的时间"); - btTemplateMethodText.setOnClickListener(this); - btTemplateMethodText2.setOnClickListener(this); + binding.btTemplateMethodText.setText("查看所有人员的工作情况"); + binding.btTemplateMethodText2.setText("查看程序猿离开公司的时间"); + binding.btTemplateMethodText.setOnClickListener(this); + binding.btTemplateMethodText2.setOnClickListener(this); } @Override diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPart.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPart.java new file mode 100644 index 0000000..d0f46be --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPart.java @@ -0,0 +1,9 @@ +package com.example.jingbin.designpattern.visitor; + +/** + * Created by jingbin on 2020-02-04. + * 1. 定义一个表示元素的接口。 + */ +public interface ComputerPart { + public void accept(ComputerPartVisitor computerPartVisitor); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartDisplayVisitor.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartDisplayVisitor.java new file mode 100644 index 0000000..3d6aebd --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartDisplayVisitor.java @@ -0,0 +1,35 @@ +package com.example.jingbin.designpattern.visitor; + +import android.util.Log; + +import com.example.jingbin.designpattern.visitor.impl.Computer; +import com.example.jingbin.designpattern.visitor.impl.Keyboard; +import com.example.jingbin.designpattern.visitor.impl.Monitor; +import com.example.jingbin.designpattern.visitor.impl.Mouse; + +/** + * Created by jingbin on 2020-02-04. + * 4. 创建实现了 ComputerPartVisitor 的实体访问者。 + */ +public class ComputerPartDisplayVisitor implements ComputerPartVisitor { + + @Override + public void visit(Computer computer) { + Log.e("---", "Displaying Computer."); + } + + @Override + public void visit(Mouse mouse) { + Log.e("---", "Displaying Mouse."); + } + + @Override + public void visit(Keyboard keyboard) { + Log.e("---", "Displaying Keyboard."); + } + + @Override + public void visit(Monitor monitor) { + Log.e("---", "Displaying Monitor."); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartVisitor.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartVisitor.java new file mode 100644 index 0000000..77baf4b --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/ComputerPartVisitor.java @@ -0,0 +1,21 @@ +package com.example.jingbin.designpattern.visitor; + +import com.example.jingbin.designpattern.visitor.impl.Computer; +import com.example.jingbin.designpattern.visitor.impl.Keyboard; +import com.example.jingbin.designpattern.visitor.impl.Monitor; +import com.example.jingbin.designpattern.visitor.impl.Mouse; + +/** + * Created by jingbin on 2020-02-04. + * 3. 定义一个表示访问者的接口。 + */ +public interface ComputerPartVisitor { + + public void visit(Computer computer); + + public void visit(Mouse mouse); + + public void visit(Keyboard keyboard); + + public void visit(Monitor monitor); +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/VisitorActivity.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/VisitorActivity.java new file mode 100644 index 0000000..8acc68f --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/VisitorActivity.java @@ -0,0 +1,47 @@ +package com.example.jingbin.designpattern.visitor; + +import androidx.databinding.DataBindingUtil; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.view.View; + +import com.example.jingbin.designpattern.R; +import com.example.jingbin.designpattern.app.AppConstant; +import com.example.jingbin.designpattern.app.EMTagHandler; +import com.example.jingbin.designpattern.databinding.ActivityVisitorBinding; +import com.example.jingbin.designpattern.visitor.impl.Computer; + +/** + * @author jingbin + * 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 + * 通过这种方式,元素的执行算法可以随着访问者改变而改变。 + * 这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 + *

+ * 主要解决:稳定的数据结构和易变的操作耦合问题。 + */ +public class VisitorActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityVisitorBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_visitor); + setTitle("访问者模式"); + binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.VISITOR_DEFINE)); + + // 5. 使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。 + binding.btComputer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ComputerPart computer = new Computer(); + computer.accept(new ComputerPartDisplayVisitor()); + /* + *打印: + *---: Displaying Mouse. + *---: Displaying Keyboard. + *---: Displaying Monitor. + *---: Displaying Computer. + */ + } + }); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Computer.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Computer.java new file mode 100644 index 0000000..1e3e475 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Computer.java @@ -0,0 +1,24 @@ +package com.example.jingbin.designpattern.visitor.impl; + +import com.example.jingbin.designpattern.visitor.ComputerPart; +import com.example.jingbin.designpattern.visitor.ComputerPartVisitor; + +/** + * Created by jingbin on 2020-02-04. + */ +public class Computer implements ComputerPart { + + private ComputerPart[] parts; + + public Computer() { + this.parts = new ComputerPart[]{new Mouse(), new Keyboard(), new Monitor()}; + } + + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + for (ComputerPart part : parts) { + part.accept(computerPartVisitor); + } + computerPartVisitor.visit(this); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Keyboard.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Keyboard.java new file mode 100644 index 0000000..40e6ac7 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Keyboard.java @@ -0,0 +1,16 @@ +package com.example.jingbin.designpattern.visitor.impl; + +import com.example.jingbin.designpattern.visitor.ComputerPart; +import com.example.jingbin.designpattern.visitor.ComputerPartVisitor; + +/** + * Created by jingbin on 2020-02-04. + * 2. 创建扩展了上述类的实体类。 + */ +public class Keyboard implements ComputerPart { + + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + computerPartVisitor.visit(this); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Monitor.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Monitor.java new file mode 100644 index 0000000..6f420ef --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Monitor.java @@ -0,0 +1,14 @@ +package com.example.jingbin.designpattern.visitor.impl; + +import com.example.jingbin.designpattern.visitor.ComputerPart; +import com.example.jingbin.designpattern.visitor.ComputerPartVisitor; + +/** + * Created by jingbin on 2020-02-04. + */ +public class Monitor implements ComputerPart { + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + computerPartVisitor.visit(this); + } +} diff --git a/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Mouse.java b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Mouse.java new file mode 100644 index 0000000..ce46d22 --- /dev/null +++ b/app/src/main/java/com/example/jingbin/designpattern/visitor/impl/Mouse.java @@ -0,0 +1,14 @@ +package com.example.jingbin.designpattern.visitor.impl; + +import com.example.jingbin.designpattern.visitor.ComputerPart; +import com.example.jingbin.designpattern.visitor.ComputerPartVisitor; + +/** + * Created by jingbin on 2020-02-04. + */ +public class Mouse implements ComputerPart { + @Override + public void accept(ComputerPartVisitor computerPartVisitor) { + computerPartVisitor.visit(this); + } +} diff --git a/app/src/main/res/drawable-xhdpi/icon.png b/app/src/main/res/drawable-xhdpi/icon.png index 1f927f0..72b6215 100644 Binary files a/app/src/main/res/drawable-xhdpi/icon.png and b/app/src/main/res/drawable-xhdpi/icon.png differ diff --git a/app/src/main/res/layout/activity_adapter.xml b/app/src/main/res/layout/activity_adapter.xml index 1a106fe..41207a9 100644 --- a/app/src/main/res/layout/activity_adapter.xml +++ b/app/src/main/res/layout/activity_adapter.xml @@ -1,49 +1,51 @@ - + -