学习lambda04-改写测试模式

lambda 改写策略模式,减少冗余代码

/**
 * ClassName: My
 *
 * @author leegoo
 * @Description:
 * @date 2019年04月28日
 */
public class My {
    public static final String STRING_RE = "[a-z]+";
    public static final String NUMBER_RE = "[0-9]+";

    public static void main(String[] args) {
        //最原始的策略模式
        Vild vSource = new StringValid(); //如果需要验证int类型,那么可以再写一个IntValid实现Vild接口即可,实现方式与StringValid类型
        vSource.v("啊啊啊");

        //匿名内部类
        Vild vAnonymous = new Vild() {
            @Override
            public Boolean v(String str) {
                return str.matches(My.STRING_RE);
            }
        };
        vAnonymous.v("啊啊啊");


        //lambda
        Vild vLambd = s -> s.matches(My.STRING_RE);
        Boolean aBoolean = vLambd.v("啊啊啊");
        System.out.println(aBoolean);


    }
}

@FunctionalInterface
interface Vild {
    Boolean v(String str);
}


class StringValid implements Vild {
    @Override
    public Boolean v(String str) {
        return str.matches(My.STRING_RE);
    }
}

lambda 改写模板模式,减少冗余代码

首先是最原始的实现方式


abstract class OnlineBanking {
    public void processCustomer(int id){
        Customer c = Database.getCustomerWithId(id); //查询会员
        makeCustomerHappy(c); //让会员happy
    }
    abstract void makeCustomerHappy(Customer c); //未实现具体的方法


    // dummy Customer class
    static private class Customer {}
    // dummy Datbase class
    static private class Database{
        static Customer getCustomerWithId(int id){ return new Customer();}
    }

    public static void main(String[] args) {
        OnlineBanking banking = new OnlineBanking() {
            //重写 makeCustomerHappy方法
            @Override
            void makeCustomerHappy(Customer c) {
                System.out.println("send gift....");
            }
        };
		//再次调用即可  send gift.....
        banking.processCustomer(1);
    }

}


接下来是lambda实现方式




public class OnlineBankingLambda {
	
    public static void main(String[] args) {
        // Customer::sendCard  调用sendCard方法,也可以改为sendGift方法,减少冗余代码 ,Consumer  中 void accept(T t);方法 需要接收一个T类型的参数
        new OnlineBankingLambda().processCustomer(1337, Customer::sendCard);
    }

    public void processCustomer(int id, Consumer<Customer> makeCustomerHappy){
        Customer c = Database.getCustomerWithId(id);
        makeCustomerHappy.accept(c);
    }

    // dummy Customer class
    static private class Customer {
        public void sendGift(){
            System.out.println("sendgift");
        }

        public void sendCard(){
            System.out.println("send card");
        }
    }
    // dummy Database class
    static private class Database{
        static Customer getCustomerWithId(int id){ return new Customer();}
    }
}

lambda 改写观察者模式,减少冗余代码

一种简单的观察者模式

有老师和护士,当他们接收到不同的命令的时候就去做相应的事情


import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: MyObserv
 *
 * @author leegoo
 * @Description:
 * @date 2019年04月28日
 */
public class MyObserv {

    interface Command {
        String excute(String demand);
    }

    static class Nurse  implements Command{
        @Override
        public String excute(String demand) {
            if (demand.contains("sick")) System.out.println("receive this demand , i will help the sick" );
            return demand;
        }
    }

    static class Teacher  implements Command{
        @Override
        public String excute(String demand) {
            if (demand.contains("student")) System.out.printf("receive this demand [ %s] , i must teacher..." ,demand);
            return demand;
        }
    }

    // 订阅处理
     interface  Subject {
         //发送消息
        String send(String msg);
         //增加订阅者
        void add(Command command);
    }

   static class Human implements Subject {
        private List<Command> list = new ArrayList<>();
        @Override
        public String send(String msg) {
            list.forEach(c->c.excute(msg));
            return msg;
        }

        @Override
        public void add(Command command) {
            list.add(command);
        }
    }

    public static void main(String[] args) {
        Human human = new Human();
        human.add(new Teacher());
        human.add(new Nurse());
        human.send("student"); //receive this demand [ student] , i must teacher...
        
        //lambda
        
        human = new Human();
        human.add((demand)->{
            //可以把此处封装成一个方法 隐藏细节
            if (demand.contains("sick"))
                System.out.println("receive this demand , i will help the sick" );
                return demand;
        });
        human.add((demand)->{
            if (demand.contains("student"))
                System.out.printf("receive this demand [ %s] , i must teacher..." ,demand);
                return demand;
        });
        human.send("sick");
    }

}

你可能感兴趣的:(lambda)