-
-
-
-
-
-
-
-
+
+
## 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+ * 这种模式涉及到一个作为桥接的接口[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
@@ -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
+ * 主要解决:对于一些固定文法构建一个解释句子的解释器。
+ */
+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
+ * 主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,
+ * 并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
+ */
+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
+ * 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
+ * 意图:为其他对象提供一种代理以控制对这个对象的访问。
+ *
+ * 主要解决:在直接访问对象时带来的问题,
+ * 比如说:要访问的对象在远程的机器上。
+ * 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),
+ * 直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
+ */
+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 @@
-