策略模式与外观模式

2023-10-29

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<Class<? extends Pet>> 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.length; i++) {
			result[i] = randomPet();
		}
		return result;
	}
	
	public List<Pet> createList(int size) {
		List<Pet> result = new ArrayList<Pet>();
		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<Class<? extends Pet>> types = new ArrayList<Class<? extends Pet>>();
	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<Class<? extends Pet>> 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<Class<? extends Pet>> 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<Class<? extends Pet>> types = allType.subList(allType.indexOf(MUTT.class), allType.size());

	@Override
	public List<Class<? extends Pet>> getTypes() {
		return types;
	}
}
d) 计数器:统计随机生成的宠物数量
package context;

import java.util.HashMap;

public class PetCount {
	static class PetConter extends HashMap<String, Integer> {
		
		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<Pet> 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);
	}
	
}


 




 

 

转载于:https://www.cnblogs.com/riasky/p/3478720.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

策略模式与外观模式 的相关文章

随机推荐

  • leetcode 路径总和 -- 递归

    0 题目描述 leetcode原题链接 112 路径总和 1 递归解法 假定从根节点到当前节点的值之和为 val 我们可以将这个大问题转化为一个小问题 是否存在从当前节点的子节点到叶子的路径 满足其路径和为 sum val 不难发现这满足递
  • 【OpenCV】噪声的添加和过滤

    1 简介 下面简单介绍两种图像噪声 即椒盐噪声和高斯噪声 1 椒盐噪声 椒盐噪声也称脉冲噪声 它是一种随机出现的白点或者黑点 可能是亮的区域有黑色像素或是在暗的区域有白色像素 或是两者皆有 图像模拟添加椒盐噪声是通过 随机获取像素点 并设置
  • Android 12上全新的应用启动API,适配一下?

    今日科技快讯 近日 谷歌宣布 将在欧洲市场上销售的Android手机中免费添加更多移动搜索应用 欧洲Android用户可以通过全新的 搜索引擎选项 来选择并设置自己设备上的默认搜索引擎 作者简介 本篇文章来自TechMerger同学的投稿
  • mysql动态ip域名连接_用本地动态IP连接本地mysql

    一个问题已经困扰了我很久的问题今天终于解决了 在用C 连接mysql时 用本地的动态IP加端口号连接本地的数据库mysql real connect conn 192 168 223 128 root mysql Project 3306
  • PCA的数学原理(非常值得阅读)!!!!

    PCA Principal Component Analysis 是一种常用的数据分析方法 PCA通过线性变换将原始数据变换为一组各维度线性无关的表示 可用于提取数据的主要特征分量 常用于高维数据的降维 网上关于PCA的文章有很多 但是大多
  • 统计字符串内某个字符出现的次数

    假如有一个字符串 cabcdasgcjaieyakxhanzgajgaa 我们要统计这个字符串里字符 a 出现的位置以及出现的次数 大致思路 先利用 indexOf 判断出该字符第一次出现的位置 只要其返回结果不等于 1 就继续往后查找 但
  • Linux基础(较全)

    Linux 0 目录 文章目录 Linux 0 目录 1 Linux简介 1 1 Linux是什么 1 2 Linux发行版 1 3 LInux应用领域 1 4 Linux vs Windows 2 Linux 虚拟机 安装 2 1 系统分
  • 数据库表结构设计方法及原则(li)

    数据库设计的三大范式 为了建立冗余较小 结构合理的数据库 设计数据库时必须遵循一定的规则 在关系型数据库中这种规则就称为范式 范式是符合某一种设计要求的总结 要想设计一个结构合理的关系型数据库 必须满足一定的范式 在实际开发中最为常见的设计
  • Java入门

    Java入门 Java 入门 主要内容 Java的地位 Java诞生 Java的特点 安装JDK 简单的Java应用程序 重点与难点 重点 Java平台无关性 Java程序的结构 难点 Java程序的开发过程 Java之父与Java的诞生
  • 探索性数据分析-如何描述业务量数据

    探索性数据分析 如何描述业务量数据 描述业务量的特征 均值 标准差 相关系数 均值代表的是集中趋势 整体的趋势 整体发展方向 整体水平 标准差代表的是离中趋势 描述事物的波动程度 在一定程度上也代表着风险 相关系数代表的是相关分析 代表的是
  • 刷脸支付有深度整合垂直领域的商业价值

    移动支付和银行卡支付没有办法确定使用者到底是谁 因为可以和家人等共同使用 刷脸支付可以确定消费实体是谁 定位到具体人确定数据标签 新零售从业者认为 刷脸支付除了提供更便捷的支付服务外 还可以提供更多的商业数据用于精细化经营 从垂直领域来看
  • 从Qt5的改变看最佳头文件包含风格?QT5找不到#include头文件在哪里

    老版本 C C code 1 2 include
  • Polkit权限提升漏洞(CVE-2021-4034)利用及修复

    Polkit本地权限提升漏洞 CVE 2021 4034 利用及修复 文章目录 Polkit本地权限提升漏洞 CVE 2021 4034 利用及修复 漏洞说明 危害等级 影响版本 修复版本 漏洞利用 漏洞修复 升级polkit版本 临时修复
  • WebSocket协议状态码1005: 理解、应用与解决方案

    WebSocket协议状态码1005 理解 应用与解决方案 引言 WebSocket协议是一种在Web应用程序中实现双向通信的协议 与传统的HTTP协议不同 WebSocket协议允许服务器主动向客户端推送数据 而不需要客户端发送请求 在W
  • TypeScript 元组类型

    TypeScript 语言中 数组中的元素一般只能是由相同数据类型组成 any 除外 如果我们想要存储不同类型的元素 则可以使用元组 TypeScript 中的元组 Tuple 从外形上来看和数组相差不多 但是元组中允许存储不同类型的元素
  • AD18画元器件封装

    AD18画元器件封装 1 在创建好的工程旁边右键给工程添加新的PCB libriary 2 在PCB libriary界面点击工具 gt 元器件向导 然后点击Next 3 可以看到不同类型元器件 可以根据自己需求选择 我选择第二个电容 单位
  • rt-thread系列文章目录

    rt thread系列文章目录 本文是rt thread系列文章目录 后续关于rt thread的更新都会添加到此文内 实战篇 rt thread 生成工程模板 rt thread fal移植 内核篇 rt thread 内存管理 内存堆
  • STM32 USB虚拟串口通信

    目录 一 使用STM32 HAL库配置 选择USB从机模式 添加USB库并选择虚拟串口模式 二 HAL库USB驱动函数介绍 三 驱动函数编写 一 使用STM32 HAL库配置 选择USB从机模式 添加USB库并选择虚拟串口模式 二 HAL库
  • SVN下载、安装、配置及使用方法

    文章目录 SVN是什么 相关概念 为什么需要SVN SVN的特点 TortoiseSVN VisualSVN Subversion 以及 VisualSVN Server的区别 为什么不直接使用Subversion SVN下载 SVN服务端
  • 策略模式与外观模式

    1 策略 定义不同的算法族 并且之间可以互相替换 让算法的变化独立于使用算法的客户 以动态的改变对象的行为 2 例子 随机生成宠物 并统计各种宠物生成数量 a 抽象类 PetCreator 用于随机生成宠物 package context