1.模板模式
定义
是类的行为模式,
在一个方法定义骨架方法,部分逻辑可以以具体的方法实现,然后将部分方法可以延迟到子类中,不同子类对具体方法不同实现
该设计模式实现超级简单,完美运用了java的继承机制
参考代码实现
优点:
封装不变部分,扩展可变部分
提取公共部分代码,便于维护
行为由父类控制,子类实现
缺点:
子类影响父类
模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤
使用场景:
多个子类有公有的方法,并且逻辑基本相同时。
重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个
重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通
过 钩子函数约束其行为
钩子函数:
是对于抽象方法或者接口中定义的方法的一个空实现,子类实现对部分方法控制是否调用
见代码实现
代码
/**
* 抽象 父类
*
* @author summit
* @since 2020/3/19 10:13
*/
public abstract class ParentAbstract {
/**
* 骨架方法
*/
public void myMethod() {
if ((onOff())) {
hook();
}
say();
}
public void hook() {
System.out.println("hook 开启");
}
/**
* 钩子控制
*/
public Boolean onOff() {
System.out.println("默认开启");
return true;
}
public void say() {
System.out.println("父类-say-method");
}
}
/**
* 子类实现
*
* @author summit
* @since 2020/3/19 10:15
*/
public class SubClazz extends ParentAbstract {
// @Override
// public Boolean onOff() {
// return false;
// }
@Override
public void say() {
System.out.println("子类-say-method");
}
public static void main(String[] args) {
SubClazz subClazz = new SubClazz();
subClazz.myMethod();
}
}
lambda表达式实现
由于每次都要创建子类,会造成系统更加庞大
/**
* @author summit
* @since 2020/3/19 10:32
*
* @see java.util.function.Predicate
*/
public interface MyTest<T> {
boolean test(T t);
default List<String> filterStr(List<String> stringList, MyTest<String> myTest) {
List<String> myStrings = new ArrayList<>();
for (String str : stringList) {
if (myTest.test(str)) {
myStrings.add(str);
}
}
return myStrings;
}
}
/**
* @author summit
* @since 2020/3/19 10:40
*/
public class MyTestImpl implements MyTest<String> {
@Override
public boolean test(String s) {
return s.length() > 2;
}
public static void main(String[] args) {
List<String> stringList = Arrays.asList("a", "bb", "ccc","dddd");
MyTest<String> myTest = new MyTestImpl();
System.out.println( myTest.filterStr(stringList,myTest));
System.out.println(myTest.filterStr(stringList, (e) -> e.length() > 3));
}
}
网友评论