构造行设计模式
策略模式
使用场景
一种算法不同的解决方案
非Lambda 实现
- 定义策略接口
- 定义多个类实现策略接口
java8 Lambda表达式实现策略模式
- 定义行为类,类中有策略的引用。
- 使用Lambda表达式不需要实现接口,只需要把策略的具体实现使用Lambda表达式传进执行的类中即可
public interface Strategy {
boolean execute(String s);
}
public class Action{
private Strategy strategy;
public Action(Strategy strategy) {
this.strategy = strategy;
}
public boolean execute(String s) {
return strategy.execute(s);
}
}
public class Main {
public static void main(String[] args) {
Action valiator = new Action(s -> s.matches("[a-z]+"));
boolean match = valiator.execute("aaa");
System.out.println(match);
Action valiator1 = new Action (s -> s.matches("[0-9]+"));
boolean match1 = valiator1.execute("111");
System.out.println(match1);
}
}
模板方法
使用场景
某个算法的部分子流程希望可以自由的修改
非Lambda 实现
public abstract class Template {
public void compute() {
method1();
method2();
}
private void method1() {
System.out.println("do method1");
}
protected abstract void method2();
}
public class TemplateImpl1 extends Template {
@Override
public void method2() {
System.out.println("TemplateImpl1 do method2");
}
}
public class TemplateImpl2 extends Template {
@Override
protected void method2() {
System.out.println("TemplateImpl2 do method2");
}
}
public class Main {
public static void main(String[] args) {
Template template1 = new TemplateImpl1();
template1.compute();
Template template2 = new TemplateImpl2();
template2.compute();
}
}
do method1
TemplateImpl1 do method2
do method1
TemplateImpl2 do method2
使用Lambda表达式实现模板方法
public class Template {
public void compute(Consumer<Object> method2, Object o) {
method1();
method2.accept(o);
}
private void method1() {
System.out.println("do method1");
}
}
public class Main {
public static void main(String[] args) {
Template template1 = new Template();
template1.compute(o -> {
System.out.println(o);
}, "templateimpl1 do method2");
Template template2 = new Template();
template1.compute(o -> {
System.out.println(o);
}, "templateimpl2 do method2");
}
}
do method1
templateimpl1 do method2
do method1
templateimpl2 do method2
接口型设计模式
适配器模式
类适配器
当客户端接口表达其需求时,可以创建一个实现该接口的新类,同时该类继承自现有类。如下代码适配器类OozinozRocket 实现接口Rocket并继承PhysicalRocket。适配器类将客户端的调用转换为对现有类PhysicalRocket的调用。
public interface RocketSim {
double getMass();
double getTrust();
void setSimTime(double d);
}
public class PhysicalRocket {
public PhysicalRocket(double burnArea, double burnTime, double fuelMass, double totalMass) {
this.burnArea = burnArea;
this.burnTime = burnTime;
this.fuelMass = fuelMass;
this.totalMass = totalMass;
}
private double burnArea;
private double burnTime;
private double fuelMass;
private double totalMass;
public double getMass() {
return this.totalMass;
}
public double getTrust() {
return fuelMass;
}
public double getBurnTime() {
return burnTime;
}
}
//适配器类
public class OozinozRocket extends PhysicalRocket implements RocketSim {
private double simTime;
public OozinozRocket(double burnArea, double burnTime, double fuelMass, double totalMass) {
super(burnArea, burnTime, fuelMass, totalMass);
}
@Override
public void setSimTime(double d) {
this.simTime = d;
}
}
对象适配器
当客户端没有指定接口时,可以创建一个新的客户端子类,它将使用现有类的示例。将客户端的调用委托给现有类的实例。OozinozRocket 是一个SkySocket 对象,但是他的实现将调用委托给OozinozRocket 。
public class SkySocket {
private double mass;
private double trust;
protected double simTime;
public double getMass() {
return this.mass;
}
public double getTrust() {
return trust;
}
public void setSimTime(double d) {
this.simTime = d;
}
}
public class PhysicalRocket {
public PhysicalRocket(double burnArea, double burnTime, double fuelMass, double totalMass) {
this.burnArea = burnArea;
this.burnTime = burnTime;
this.fuelMass = fuelMass;
this.totalMass = totalMass;
}
private double burnArea;
private double burnTime;
private double fuelMass;
private double totalMass;
public double getMass() {
return this.totalMass;
}
public double getTrust() {
return fuelMass;
}
public double getBurnTime() {
return burnTime;
}
}
public class OozinozRocket extends SkySocket {
private PhysicalRocket physicalRocket;
public OozinozRocket(PhysicalRocket physicalRocket) {
this.physicalRocket = physicalRocket;
}
public double getTrust() {
return physicalRocket.getTrust();
}
public double getMass() {
return physicalRocket.getMass();
}
public void setSimTime(double d) {
this.simTime = d;
}
}
合成(composite)模式
设计合成类可以用于维护合成对象的集合,合成对象既可以支持叶子对象,又支持组合对象。组合对象与单个对象共享同一个接口
public interface Component {
int operate();
boolean isTree(Set<Component> visited);
}
public class Leaf implements Component {
@Override
public int operate() {
return 1;
}
@Override
public boolean isTree(Set<Component> visited) {
visited.add(this);
return false;
}
}
public class Composite implements Component {
private List<Component> component;
{
component = new ArrayList<>();
public void add(Component component) {
this.component.add(component);
}
@Override
public int operate() {
return component.stream().map(e -> {
return e.operate();
}).reduce(0, (a, b) -> a + b);
}
@Override
public boolean isTree(Set<Component> visited) {
visited.add(this);
return component.stream().filter(e -> visited.contains(e) || !e.isTree(visited)).findAny().isPresent();
}
}
public class Main {
public static void main(String[] args) {
Composite composite1 = new Composite();
composite1.add(new Leaf());
composite1.add(new Leaf());
Composite composite2 = new Composite();
composite2.add(new Leaf());
composite2.add(new Leaf());
composite1.add(composite2);
int sum = composite1.operate();
boolean isTree = composite1.isTree(new HashSet<>());
System.out.println(sum + "" + isTree);
}
}
桥接(bridge)模式
桥接模式关注抽象的设计,抽象是指包含了一组抽象方法的类,这些抽象方法可能包含多个实现。
如果想将最初的类层次结构分解为另一种层次结构,既可以使用桥接模式将 抽象方法转移到另一个类层次结构中。
如下代码接口MachineDriver及其实现类为一个类结构。现想再定义出一个类结构对MachineDriver进行管理,MachineManger及其子类 就是新的类结构,他们实现了与MachineDriver类结构的分离。
public interface MachineDriver {
void startMachine();
void stopMachine();
void startProcess();
void stopProcess();
void conveyIn();
void conveyOut();
}
public class FuserDriver implements MachineDriver {
@Override
public void startMachine() {
System.out.println("start machine fuserDriver");
}
@Override
public void stopMachine() {
System.out.println("stop machine fuserDriver");
}
@Override
public void startProcess() {
System.out.println("start process fuserDriver");
}
@Override
public void stopProcess() {
System.out.println("stop process fuserDriver");
}
@Override
public void conveyIn() {
System.out.println("conveyIn fuserDriver");
}
@Override
public void conveyOut() {
System.out.println("conveyOut fuserDriver");
}
}
public class StarPressDriver implements MachineDriver {
@Override
public void startMachine() {
System.out.println("start machine StarPressDriver");
}
@Override
public void stopMachine() {
System.out.println("stop machine StarPressDriver");
}
@Override
public void startProcess() {
System.out.println("start process StarPressDriver");
}
@Override
public void stopProcess() {
System.out.println("stop process StarPressDriver");
}
@Override
public void conveyIn() {
System.out.println("conveyIn StarPressDriver");
}
@Override
public void conveyOut() {
System.out.println("conveyOut StarPressDriver");
}
}
public abstract class MachineManger {
protected MachineDriver machineDriver;
protected double timeOut;
public MachineManger(MachineDriver machineDriver) {
this.machineDriver = machineDriver;
}
protected abstract void shutdown();
protected abstract void start();
protected abstract void setTimeOut(double timeOut);
}
public class HskMachineManger extends MachineManger {
public HskMachineManger(MachineDriver machineDriver) {
super(machineDriver);
}
@Override
protected void shutdown() {
this.machineDriver.stopProcess();
this.machineDriver.stopMachine();
}
@Override
protected void start() {
this.machineDriver.startProcess();
this.machineDriver.startMachine();
}
@Override
protected void setTimeOut(double timeOut) {
this.timeOut = timeOut;
}
}
public class Main {
public static void main(String[] args) {
MachineDriver fuserDriver = new FuserDriver();
MachineManger machineManger = new HskMachineManger(fuserDriver);
machineManger.start();
machineManger.shutdown();
machineManger.setTimeOut(100);
}
}
职责型设计模式
观察者模式
使用场景
某些事件发生时(比如状态转变),如果一个对象(通 常我们称之为主题)需要自动地通知其他多个对象(称为观察者),就会采用该方案
非Lambda 实现
public interface Observer {
void notify(String tweet);
}
public interface Subject {
void registerObserver(Observer o);
void notifyObservers(String tweet);
}
public class Observer1 implements Observer {
@Override
public void notify(String tweet) {
System.out.println(tweet + "1");
}
}
public class Observer2 implements Observer {
@Override
public void notify(String tweet) {
System.out.println(tweet + "2");
}
}
public class SubjectImpl implements Subject {
private List<Observer> observerList = new ArrayList<>();
@Override
public void registerObserver(Observer o) {
observerList.add(o);
}
@Override
public void notifyObservers(String tweet) {
observerList.stream().forEach(e -> {
e.notify(tweet);
});
}
}
public class Main {
public static void main(String[] args) {
Subject f = new SubjectImpl();
f.registerObserver(new Observer1());
f.registerObserver(new Observer2());
f.notifyObservers("notify observer");
}
}
notify observer1
notify observer2
java8 使用Lambda表达式实现观察者模式
public class Observer1 implements Observer {
private Consumer<Object> consumer;
public Observer1(Consumer<Object> consumer) {
this.consumer = consumer;
}
@Override
public void notify(Object tweet) {
consumer.accept(tweet);
}
}
public class Observer2 implements Observer {
private Consumer<Object> consumer;
public Observer2(Consumer<Object> consumer) {
this.consumer = consumer;
}
@Override
public void notify(Object tweet) {
consumer.accept(tweet);
}
}
public static void main(String[] args) {
Subject f = new SubjectImpl();
f.registerObserver(new Observer1(e -> {
System.out.println(e + "1");
}));
f.registerObserver(new Observer2(e -> {
System.out.println(e + "2");
}));
f.notifyObservers("notify observer");
}
}
责任链模式
使用场景
责任链模式是一种创建处理对象序列(比如操作序列)的通用方案。一个处理对象可能需要 在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作,再转交给下一个处 理对象,以此类推。
非Lambda 实现
public abstract class ProcessingObject<T> {
private ProcessingObject<T> successor;
public void setSuccessor(ProcessingObject<T> successor) {
this.successor = successor;
}
public T handle(T t) {
T t1 = handleWork(t);
if (successor != null) {
return successor.handle(t1);
}
return t1;
}
protected abstract T handleWork(T t);
}
public class ProcessingChain1 extends ProcessingObject<String> {
@Override
protected String handleWork(String text) {
return "hello, " + text;
}
}
public class ProcessingChain2 extends ProcessingObject<String> {
@Override
protected String handleWork(String text) {
return text.replace("chai","chain");
}
}
public class Main {
public static void main(String[] args) {
ProcessingObject<String> processingObject1 = new ProcessingChain1();
ProcessingObject<String> processingObject2 = new ProcessingChain2();
processingObject1.setSuccessor(processingObject2);
String res = processingObject1.handle("I am chai of responsibility pattern !");
System.out.println(res);
}
}
hello, I am chain of responsibility pattern !
java8 Lambda实现责任链
public class Main {
public static void main(String[] args) {
UnaryOperator<String> processingObject1 = (String text) ->text ;
UnaryOperator<String> processingObject2 = (String text) -> text.replace("chai", "chain");
Function<String, String> pipeline = processingObject1.andThen(processingObject2);
String res = pipeline.apply("Hello,I am chai of reponsibility pattern !");
System.out.println(res);
}
Hello,I am chain of reponsibility pattern !
}
工厂模式
使用场景
使用工厂模式,不同条件下创建不同实例时,你无需向客户暴露实例化的逻辑就能完成对象的创建。
java8 之前实现方法
public interface Product {
void product();
}
public class Product1 implements Product {
@Override
public void product() {
System.out.println("I am product1");
}
}
public class Product2 implements Product {
@Override
public void product() {
System.out.println("I am product2");
}
}
public class ProductFactory {
public static Product createProduct(String name) {
switch (name) {
case "product1":
return new Product1();
case "product2":
return new Product2();
default:
throw new RuntimeException("no such product");
}
}
}
public class Main {
public static void main(String[] args) {
Product product1 = ProductFactory.createProduct("product1");
product1.product();
Product product2 = ProductFactory.createProduct("product2");
product2.product();
}
}
I am product1
I am product2
Java8 新特性实现
public class ProductFactory {
private static Map<String, Supplier<Product>> factory = null;
static {
factory.put("product1", Product1::new);
factory.put("product2", Product2::new);
}
public static Product createProduct(String name) {
Supplier<Product> productSupplier = factory.get(name);
if (productSupplier != null) {
return productSupplier.get();
}
throw new RuntimeException("no such product ");
}
}
享元(flyweight)模式
public interface Chemical {
String getName();
String getSymbol();
}
public class ChemicalFactory {
private static Map<String, Chemical> chemicalMap = new HashMap<>();
static {
ChemicalFactory factory = new ChemicalFactory();
chemicalMap.put("Carbon", factory.new ChemicalImpl("Carbon", "C"));
}
class ChemicalImpl implements Chemical {
private String name;
private String symbol;
ChemicalImpl(String name, String symbol) {
this.name = name;
this.symbol = symbol;
}
public String getName() {
return name;
}
public String getSymbol() {
return symbol;
}
}
public static Chemical getChemical(String name) {
return chemicalMap.get(name);
}
}
public class Main {
public static void main(String[] args) {
Chemical chemical = ChemicalFactory.getChemical("Carbon");
System.out.println(chemical.getName());
}
}
构建者模式(builder)
构建者模式将复杂对象的构建逻辑从对象本身抽离出来,这样可以简化复杂的对象。构建者关注目标类的构建过程,目标类关注合法的实例业务本身。