静态代理模式和Lamda表达式
静态代理模式
我们用鸣人结婚来举例吧,在火影大战后,鸣人立下了赫赫战功。现任卡卡西想要退位泡温泉,鸣人当然是准备接受火影之位了。但是此时与雏田的婚礼也急需要准备,鸣人当然忙不过来了。此时,出现了一个很牛逼的一条龙服务公司帮助鸣人筹划婚礼,让鸣人可以不再分心。
我们先定义一个结婚的功能。
//创建一个接口实现结婚功能
interface Marry{
public void happyMarry();
}
鸣人要结婚,所以鸣人要实现这个接口。
//创建一个鸣人类实现结婚功能的接口,鸣人是委托者
class Naruto implements Marry {
@Override
public void happyMarry() {
System.out.println("哪里痛和雏田结婚了!!!");
}
}
一条龙婚庆公司当然也具有办婚礼的功能了。
//创建一个婚庆公司作为代理对象
class WeddingCompany implements Marry{
private Marry target;//接受结婚对象,就是委托者
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {//一条龙婚庆服务
before();
this.target.happyMarry();//这就是真实结婚对象
after();
}
private void after() {
System.out.println("婚礼结束,结账");
}
private void before() {
System.out.println("婚礼之前,布置现场");
}
}
public class StaticProxy {
public static void main(String[] args) {
Naruto mingren = new Naruto();//实例化鸣人
WeddingCompany weddingCompany = new WeddingCompany(mingren);//实例化婚庆公司
weddingCompany.happyMarry();//婚庆公司举办婚礼
}
}
运行结果如下:
这就是我认为的静态代理,婚庆公司就是代理者,鸣人就是委托者,正真结婚的对象其实还是鸣人,代理对象要接收委托对象就像是婚庆公司接受鸣人的委托。
Lamda表达式
我们在写代码的时候总是在想着让代码更高效率,代码量少一点。但是,我们总是要为了调用方法去创建类,写一点代码一堆new,这样就显的代码很繁琐。就用上面的例子不断简化:
public class StaticProxy {
public static void main(String[] args) {
// 1.创建具体对象,再调用方法
// Naruto mingren = new Naruto();
// WeddingCompany weddingCompany = new WeddingCompany(mingren);
// weddingCompany.happyMarry();
// 2.用匿名对象调用方法
// new WeddingCompany(new Naruto()).happyMarry();
// 3.使用功能接口,直接省去写Naruto类,直接提交委托内容
// new WeddingCompany(new Marry() {
// @Override
// public void happyMarry() {
// System.out.println("哪里痛和雏田结婚了");
// }
// }).happyMarry();
// 4.使用Lambda表达式,更加牛逼(☆▽☆)
new WeddingCompany(()-> System.out.println("哪里痛和雏田结婚了")).happyMarry();
}
}
//创建一个接口实现结婚功能
interface Marry{
public void happyMarry();
}
//创建一个鸣人类实现结婚功能的接口,鸣人是委托者
class Naruto implements Marry {
@Override
public void happyMarry() {
System.out.println("哪里痛和雏田结婚了!!!");
}
}
//创建一个婚庆公司作为代理对象
class WeddingCompany implements Marry{
private Marry target;//接受结婚对象,就是委托者
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {//一条龙婚庆服务
before();
this.target.happyMarry();//这就是真实结婚对象
after();
}
private void after() {
System.out.println("婚礼结束,结账");
}
private void before() {
System.out.println("婚礼之前,布置现场");
}
}
在不断简化后,突然发现,我们已经可以不用去专门定义鸣人类了,代码在不断减少,但是功能依然实现,我们的目的就达到了。
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
Lamda表达式的使用前提:函数式接口
函数式接口就是只实现一个方法的接口,such as:
//创建一个接口实现结婚功能
interface Marry{
public void happyMarry();
}
感谢客官赏脸看完,学的不乍地的学生小白,有不对的地方望大佬指正。
话说鸣人有多重影分身哈哈哈,白忙活了半天。
个人博客