1.策略 :定义不同的

2. 例子:随机生成宠物,并统计各种宠物生成数量。

a) 抽象类:PetCreator,用于随机生成宠物。

package context;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.Random;

public abstract class PetCreator {

private Random rand = new Random(47);

//抽象接口,策略模式,子类实现具体策略

public abstract List> getTypes();

public Pet randomPet() {

int n = rand.nextInt(getTypes().size());

try {

return getTypes().get(n).newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

return null;

}

public Pet[] createArray(int size) {

Pet[] result = new Pet[size];

for(int i=0; i

result[i] = randomPet();

}

return result;

}

public List createList(int size) {

List result = new ArrayList();

Collections.addAll(result, createArray(size));

return result;

}

}

b) 策略1:依据字符串生成宠物类型

package context;

import java.util.ArrayList;

import java.util.List;

public class ForNameCreator extends PetCreator {

private static List> types = new ArrayList>();

private static String[] typeNames = {

"context.Pet",

"context.Cat",

"context.Dog",

"context.Rodent",

"context.MUTT",

"context.PUG",

"context.Manx",

"context.EgyptianMau",

"context.Cymric",

"context.Rat",

"context.Mouse",

"context.Hamster"

};

@SuppressWarnings("unchecked")

private static void loader() {

try {

for(String name : typeNames) {

types.add((Class extends Pet>) Class.forName(name));

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

static {

loader();

}

@Override

public List> getTypes() {

return types;

}

}

c) 策略2:依据class生成宠物类型

package context;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

public class LiteralPetCreator extends PetCreator {

@SuppressWarnings("unchecked")

public static final List> allType = Collections.unmodifiableList(Arrays.asList(

Pet.class, Dog.class, Cat.class, Rodent.class, MUTT.class, PUG.class, Manx.class,

EgyptianMau.class, Cymric.class, Rat.class, Mouse.class, Hamster.class));

private static final List> types = allType.subList(allType.indexOf(MUTT.class), allType.size());

@Override

public List> getTypes() {

return types;

}

}

d) 计数器:统计随机生成的宠物数量

package context;

import java.util.HashMap;

public class PetCount {

static class PetConter extends HashMap {

private static final long serialVersionUID = 1L;

public void count(String type) {

Integer num = get(type);

if(null == num) {

put(type, 1);

} else {

put(type, num + 1);

}

}

}

public static void countPet(PetCreator petCreator) {

PetConter petConter = new PetConter();

for(Pet pet : petCreator.createArray(20)) {

System.out.print(pet.getClass().getSimpleName() + " ");

if(pet instanceof MUTT) {

petConter.count("MUTT");

}

if(pet instanceof PUG) {

petConter.count("PUG");

}

if(pet instanceof EgyptianMau) {

petConter.count("EgyptianMau");

}

if(pet instanceof Cymric) {

petConter.count("Cymric");

}

if(pet instanceof Manx) {

petConter.count("Manx");

}

if(pet instanceof Rat) {

petConter.count("Rat");

}

if(pet instanceof Mouse) {

petConter.count("Mouse");

}

if(pet instanceof Hamster) {

petConter.count("Hamster");

}

if(pet instanceof Rodent) {

petConter.count("Rodent");

}

if(pet instanceof Dog) {

petConter.count("Dog");

}

if(pet instanceof Cat) {

petConter.count("Cat");

}

if(pet instanceof Pet) {

petConter.count("Pet");

}

}

System.out.println();

System.out.println(petConter);

}

public static void main(String[] args) {

//PetCount.countPet(new ForNameCreator());

PetCount.countPet(Pets.creator);

}

}

e) 外观实现:将策略2定义为默认实现

package context;

import java.util.List;

public class Pets {

public static final PetCreator creator = new LiteralPetCreator(); //外观模式

public static Pet randomPet() {

return creator.randomPet();

}

public static Pet[] createArray(int size) {

return creator.createArray(size);

}

public static List createList(int size) {

return creator.createList(size);

}

}

f) 宠物类:

package context;

public class Pet {

private String name;

public Pet() {

super();

}

public Pet(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

class Dog extends Pet {

public Dog() {

super();

}

public Dog(String name) {

super();

}

}

class MUTT extends Dog {

public MUTT() {

super();

}

public MUTT(String name) {

super(name);

}

}

class PUG extends Dog {

public PUG() {

super();

}

public PUG(String name) {

super(name);

}

}

class Cat extends Pet {

public Cat() {

super();

}

public Cat(String name) {

super(name);

}

}

class Manx extends Cat {

public Manx() {

super();

}

public Manx(String name) {

super(name);

}

}

class EgyptianMau extends Cat {

public EgyptianMau() {

super();

}

public EgyptianMau(String name) {

super(name);

}

}

class Cymric extends Manx {

public Cymric() {

super();

}

public Cymric(String name) {

super(name);

}

}

class Rodent extends Pet {

public Rodent() {

super();

}

public Rodent(String name) {

super(name);

}

}

class Rat extends Rodent {

public Rat() {

super();

}

public Rat(String name) {

super(name);

}

}

class Mouse extends Rodent {

public Mouse() {

super();

}

public Mouse(String name) {

super(name);

}

}

class Hamster extends Rodent {

public Hamster() {

super();

}

public Hamster(String name) {

super(name);

}

}

java计数器策略模式_策略模式与外观模式 | 学步园相关推荐

  1. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园

    搜索引擎中对于Q查询,都会涉及到字符串归一化这个步骤,以提高结果召回率.字符串的归一化包括三个方面:繁体转简体:全角字符转半角:大写字母转小写. 建倒排时,会先对字符串做归一化处理,然后再分词取ter ...

  2. java 汽车加油问题_贪心算法 汽车加油问题 | 学步园

    / //一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效      // // // n和k个加油站位置,编程计算最少加油次数.并证明算法能产生一个最优解.    // //要求:   ...

  3. java 外观模式类图_Java 设计模式——外观模式

    概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...

  4. 设计模式之外观模式php,PHP设计模式:外观模式

    前言 菜鸟教程对外观模式的描述是:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口, ...

  5. java helper 设计模式_必知必会的 Java 设计模式入门知识(十):外观模式

    外观模式 GitHub 地址:yifanzheng/design-pattern​github.com 外观模式(Facade Design Pattern),在 GoF 的<设计模式>一 ...

  6. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  7. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  8. 构建器模式_我喜欢构建器模式的三个原因

    构建器模式 有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描 ...

  9. java 外观模式_Java设计模式11:外观模式

    外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一 ...

最新文章

  1. 从零开始学习PYTHON3讲义(一)认识Python
  2. python双循环zip_Python 并行遍历zip()函数使用方法
  3. 计算机网络之数据链路层:13、令牌传递协议、轮询协议-轮询访问介质访问控制
  4. python api测试框架_python api 测试框架
  5. Spring自学日志04(java的方式配置Spring)
  6. 【redis】redis应用场景,缓存的各种问题
  7. multer处理post请求的代码演示
  8. Windows10配置maven环境变量(图文教程)
  9. 使用apache+mod_wsgi方式部署完成后,访问网站时400(Bad Request)
  10. 萤火虫算法_萤火虫算法(一)
  11. linux非root用户添加rzsz,Linux rz sz 安装
  12. 泛微OA的SQL语句大全
  13. Spring Boot Actuator监控端点小结
  14. 靠天收粮江西 国稻种芯·中国水稻节:锐变高标准农田示范省
  15. 红米k30 允许调用gpu调试层_高效渲染!RTX 3090卡皇打造NVIDIA STUDIO强力主机实战体验|nvidia|显卡|gpu|cpu|内存...
  16. Linux系统中查看LWP(轻量级进程)、进程 、 线程的ID的方法
  17. EXCEL中怎么把单元格中的数值提取出来?Excel提取单元格数字或某格式的字符串,支持正则式提取的绿色工具
  18. window7系统电脑屏幕亮度调节
  19. java-php-python-ssm-兴澜幼儿园管理系统-计算机毕业设计
  20. oracle表空间 online,表空间的ONLINE和OFFLINE状态

热门文章

  1. 关于使用sudo命令后找不到JAVA_HOME的问题
  2. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
  3. Zabbix 监控获取apache_status
  4. Oracle导入导出dmp文件
  5. 与servlet Api 的集成
  6. 为何那么多人的网名都叫易天啊
  7. MYSQL日期 字符串 时间戳互转
  8. Echarts的坐标调整,调整内部网格和外部的间隔
  9. 软件缺陷的状态有哪些??
  10. 2012年4月当选微软MVP的CSDN会员名单揭晓!