当前位置: 首页 > wzjs >正文

烟台免费网站建站模板厦门百度推广开户

烟台免费网站建站模板,厦门百度推广开户,本地局域网搭建wordpress,wordpress是哪国程序简介 模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性, 模板方法中包含的角色: 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本…

简介

模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性,

模板方法中包含的角色:

  • 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本方法构成
    • 模板方法:定义了算法的基本流程
    • 基本方法:模板方法的具体步骤,基本方法是可以被抽象到父类中的公共方法,多个子类可以同时使用的方法就是基本方法
    • 抽象方法:需要交给子类实现的方法,不同子类有着不同的实现
  • 具体子类:实现抽象类中定义的抽象方法

适用场景:适合于算法的整体步骤是固定的,但是其中个别部分容易变化,不同子类有着不同实现。

模板方法模式的实现

案例:一个小demo,厨师炒菜,炒菜的顺序是不变的,不同厨师使用不同的菜

第一步:抽象类,在模板方法中定义整体流程

public abstract class AbstractTemplate {// 模板方法:厨师炒菜的基本流程public void cookProcess(){pourOil(); // 倒油heatOil(); // 热油pourVegetable();  // 放菜pourSauce();   // 放调料fry();  // 炒菜}// 基本方法private void pourOil(){System.out.println("倒油");}private void heatOil(){System.out.println("热油");}private void fry() {System.out.println("炒菜");}// 交给子类实现的抽象方法protected abstract void pourVegetable();protected abstract void pourSauce();
}

第二步:具体子类实现父类中的抽象方法

// 具体子类:厨师A
public class ConcreteClassBaoCai extends AbstractTemplate {private String name;public ConcreteClassBaoCai() { }public ConcreteClassBaoCai(String name) {this.name = name;}@Overridepublic void pourVegetable() {System.out.println(name + ": 下锅的蔬菜是包菜");}@Overridepublic void pourSauce() {System.out.println(name + ": 下锅的调料是辣椒");}
}// 具体子类:厨师B
public class ConcreteClassCaiXin extends AbstractTemplate {private String name;public ConcreteClassCaiXin() { }public ConcreteClassCaiXin(String name) {this.name = name;}@Overridepublic void pourVegetable() {System.out.println(name + ": 下锅的蔬菜是菜心");}@Overridepublic void pourSauce() {System.out.println(name + ": 下锅的调料是醋");}
}

测试:

public class Client {public static void main(String[] args) {ConcreteClassBaoCai classBaoCai = new ConcreteClassBaoCai("厨师A");classBaoCai.cookProcess();ConcreteClassCaiXin classCaiXin = new ConcreteClassCaiXin("厨师B");classCaiXin.cookProcess();}
}

使用案例

jdk中的juc包,里面就使用到了模板方法设计模式。具体来说,juc包中提供了一系列的锁工具,无论是什么类型的锁,它的共有流程都是获取锁成功后改变锁标志状态然后向下执行、获取锁失败后进入阻塞队列、锁释放后唤醒阻塞队列中的头结点,不同类型的锁,例如公平锁、非公平锁,它们是获取锁的方式不同,例如,公平锁如果发现阻塞队列中有值,会加入阻塞队列,非公平锁会直接获取锁,获取失败后才会加入阻塞队列,所以juc把锁相关的共有流程提取到了aqs中,把不同类型的锁独有的特性放到了具体的锁实现类中。接下来做一个详细介绍

1、juc中的模板方法:aqs中定义了获取锁的整体流程

public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplements java.io.Serializable {// 这就是一个模板方法,定义了获取锁的流程public final void acquire(int arg) {if (!tryAcquire(arg) &&  // 获取锁,成功后返回true,然后向下执行acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) // 获取锁失败,进入阻塞队列selfInterrupt();}// 交给子类实现的抽象方法,定义了获取锁的方式protected boolean tryAcquire(int arg) {// 这里的设计值得借鉴,在空方法中抛异常,避免外部误调用throw new UnsupportedOperationException();}// 父类中实现的具体方法,定义了获取锁失败后进入进入阻塞队列的方式,// 无论哪种类型的锁,进入阻塞队列的方式都是一样的final boolean acquireQueued(final Node node, int arg) {boolean failed = true;try {boolean interrupted = false;for (;;) {final Node p = node.predecessor();if (p == head && tryAcquire(arg)) {setHead(node);p.next = null; // help GCfailed = false;return interrupted;}if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())interrupted = true;}} finally {if (failed)cancelAcquire(node);}}
}

2、子类的具体实现

实现方式1:ReentrantLock中公平锁的实现方式

static final class FairSync extends Sync {private static final long serialVersionUID = -3000897897090466540L;final void lock() {acquire(1);}// 这里就是重写了上面父类中的tryAquire方法,定义了公平锁获取锁的方式protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {  // 锁没有被获取到if (!hasQueuedPredecessors() &&  // 队列中是否有元素compareAndSetState(0, acquires)) {  // 如果没有,获取锁setExclusiveOwnerThread(current);  // 获取锁成功后,当前线程设置为独占线程return true;}}else if (current == getExclusiveOwnerThread()) {  // 如果当前线程已经获取到了锁int nextc = c + acquires;  // 可重入的逻辑if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}
}

实现方式2:ReentrantLock中非公平锁的实现方式

static final class NonfairSync extends Sync {// 这里重写了父类中的tryAcquire方法,定义了非公平锁的获取方式protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}final boolean nonfairTryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (compareAndSetState(0, acquires)) {  // 如果锁没有被持有,直接尝试获取锁setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}
}

总结:这里顺便介绍了公平锁和非公平锁的实现,可以看出,唯一的区别在于,非公平锁在会直接尝试获取锁,公平锁会先判断阻塞队列中有没有元素,如果没有,再去获取锁,否则加入阻塞队列。

总结

模板方法设计模式,它的使用场景是,如果有多个类似的实体,它们有着共同的流程,每个实体又都有自己独特的地方,可以把它们相同的功能抽取出来,设计成一个模板方法,然后子类负责实现某些关键步骤,例如,之前的公平锁和非公平锁,它们获取锁的方式不同,但是获取锁失败后进入阻塞队列的方式是一样的。


文章转载自:

http://oXX8KJVU.wspjn.cn
http://Q3v6vS4z.wspjn.cn
http://Bwzdy2U2.wspjn.cn
http://JOaNGY3W.wspjn.cn
http://PHIdczMX.wspjn.cn
http://kEoo0cxm.wspjn.cn
http://taPiaL9T.wspjn.cn
http://ZbUi2x3w.wspjn.cn
http://oN0rKlDY.wspjn.cn
http://N91fEqN6.wspjn.cn
http://mdi1ci1x.wspjn.cn
http://89wyF4F8.wspjn.cn
http://zhLUCpIp.wspjn.cn
http://ef6mMq9r.wspjn.cn
http://JWrm4nqS.wspjn.cn
http://IsN0LK3J.wspjn.cn
http://l2908Jh1.wspjn.cn
http://ygYp5lD8.wspjn.cn
http://0sa474W9.wspjn.cn
http://ifnRLlC9.wspjn.cn
http://KePQgBd4.wspjn.cn
http://Ye2LlMFO.wspjn.cn
http://MaX5i3Dh.wspjn.cn
http://asBjO898.wspjn.cn
http://ebXJIoGe.wspjn.cn
http://Bvhz5VzN.wspjn.cn
http://W3RoGQKw.wspjn.cn
http://1XEK8hSJ.wspjn.cn
http://umfLBeGv.wspjn.cn
http://fbq63aiy.wspjn.cn
http://www.dtcms.com/wzjs/744127.html

相关文章:

  • 江油建设局网站黑科技引流推广神器下载
  • 百度网站建设工资一个网站的tdk是指网站的
  • 青岛网站设计公司价格物联网工程就业前景
  • 网站建设大小许昌seo推荐
  • 上海哪家做网站关键词排名网站解析后 问题
  • 网站设计配色网站推广技巧和方法
  • 建筑网站大图网页设计范例
  • 做一个网站做少多少钱做网站需要考虑哪些
  • 湛江专业建网站哪家好wordpress 知鸟
  • 中国建设银行网站企业网银老站改版与新建网站
  • 徐州网站排名优化做斗图的网站
  • 竹子建站模板怎么下载做展览的网站
  • 网站搜索不到了花卉网站源码
  • 有域名怎样建设网站html 社区网站 模板
  • 学网站建设需要什么软件学做网站多长时间
  • 龙岗南联网站建设陕西中洋建设有限公司网站
  • 河南网站推广电话wordpress主题汉化插件下载
  • 专业的网站设计制作甘肃兰州
  • 做自媒体哪家网站好网站建设实施流程
  • 企业网站建设需求分析如何提高网站点击率怎么做
  • 网站系统怎么建设wordpress手机版登录
  • 小吃培训网站源码seo是什么意思怎么读
  • 做app网站建设专做品质游的网站
  • 网站登陆模板全球速卖通是正规平台吗
  • 纯文本网站连接怎么做网站推广怎么样
  • 网站后台 添加用户企业营销型网站特点
  • 网站建设情况总结中国新闻社待遇
  • 剑三代售网站怎么做php钓鱼网站怎么做视频教程
  • 做家电维修网站能接到单吗wordpress付费知识
  • 西山区城市建设局网站最好看免费观看高清大全大理寺少