设计模式学习

构造行设计模式

策略模式

使用场景

一种算法不同的解决方案

非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)

构建者模式将复杂对象的构建逻辑从对象本身抽离出来,这样可以简化复杂的对象。构建者关注目标类的构建过程,目标类关注合法的实例业务本身。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值