java计数器策略模式_策略模式与外观模式 | 学步园
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计数器策略模式_策略模式与外观模式 | 学步园相关推荐
- java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
搜索引擎中对于Q查询,都会涉及到字符串归一化这个步骤,以提高结果召回率.字符串的归一化包括三个方面:繁体转简体:全角字符转半角:大写字母转小写. 建倒排时,会先对字符串做归一化处理,然后再分词取ter ...
- java 汽车加油问题_贪心算法 汽车加油问题 | 学步园
/ //一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效 // // // n和k个加油站位置,编程计算最少加油次数.并证明算法能产生一个最优解. // //要求: ...
- java 外观模式类图_Java 设计模式——外观模式
概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...
- 设计模式之外观模式php,PHP设计模式:外观模式
前言 菜鸟教程对外观模式的描述是:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口, ...
- java helper 设计模式_必知必会的 Java 设计模式入门知识(十):外观模式
外观模式 GitHub 地址:yifanzheng/design-patterngithub.com 外观模式(Facade Design Pattern),在 GoF 的<设计模式>一 ...
- 创建型模式、结构型模式和行为型模式_设计模式之创建型模式
设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...
- 抽象工厂模式_设计模式系列—抽象工厂模式
前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...
- 构建器模式_我喜欢构建器模式的三个原因
构建器模式 有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描 ...
- java 外观模式_Java设计模式11:外观模式
外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一 ...
最新文章
- 从零开始学习PYTHON3讲义(一)认识Python
- python双循环zip_Python 并行遍历zip()函数使用方法
- 计算机网络之数据链路层:13、令牌传递协议、轮询协议-轮询访问介质访问控制
- python api测试框架_python api 测试框架
- Spring自学日志04(java的方式配置Spring)
- 【redis】redis应用场景,缓存的各种问题
- multer处理post请求的代码演示
- Windows10配置maven环境变量(图文教程)
- 使用apache+mod_wsgi方式部署完成后,访问网站时400(Bad Request)
- 萤火虫算法_萤火虫算法(一)
- linux非root用户添加rzsz,Linux rz sz 安装
- 泛微OA的SQL语句大全
- Spring Boot Actuator监控端点小结
- 靠天收粮江西 国稻种芯·中国水稻节:锐变高标准农田示范省
- 红米k30 允许调用gpu调试层_高效渲染!RTX 3090卡皇打造NVIDIA STUDIO强力主机实战体验|nvidia|显卡|gpu|cpu|内存...
- Linux系统中查看LWP(轻量级进程)、进程 、 线程的ID的方法
- EXCEL中怎么把单元格中的数值提取出来?Excel提取单元格数字或某格式的字符串,支持正则式提取的绿色工具
- window7系统电脑屏幕亮度调节
- java-php-python-ssm-兴澜幼儿园管理系统-计算机毕业设计
- oracle表空间 online,表空间的ONLINE和OFFLINE状态