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

网页设计模板免费网站网络营销方式有哪些类型

网页设计模板免费网站,网络营销方式有哪些类型,中国交通建设集团,微网站内容目录 1.扩展点使用实例 2.主要技术点 2.1 注解加持 2.2 注解解析 2.3 扩展点路由 在实际项目中#xff0c;我们经常使用策略模式、或者状态模式来隔离同一接口下不同的实现逻辑#xff0c;进而消除代码中ifelse硬编码分支#xff0c;使代码结构更清晰#xff0c;也大大…目录 1.扩展点使用实例 2.主要技术点 2.1 注解加持 2.2 注解解析 2.3 扩展点路由 在实际项目中我们经常使用策略模式、或者状态模式来隔离同一接口下不同的实现逻辑进而消除代码中ifelse硬编码分支使代码结构更清晰也大大提升了代码可读性同时也满足了“开闭原则”具备更高的可扩展性 在cola架构中给出了一种“扩展点”的思路本质还是策略模式的实现方式通过“扩展点注解”的组装方式将策略模式实现类注册到容器中供后续场景逻辑决策使用 1.扩展点使用实例 首先通过实例了解下cola 扩展点的使用方式 1.首先定义一个SomeExtPt接口并实现ExtensionPointI接口 public interface SomeExtPt extends ExtensionPointI {public void doSomeThing(); } 2.具体实现SomeExtPt接口这里给出了2个实现类如下 Extension(bizId A) Component public class SomeExtensionA implements SomeExtPt {Overridepublic void doSomeThing() {System.out.println(SomeExtensionA::doSomething);}} Extension(bizId B) Component public class SomeExtensionB implements SomeExtPt {Overridepublic void doSomeThing() {System.out.println(SomeExtensionB::doSomething);}} 3.测试方法 RunWith(SpringJUnit4ClassRunner.class) SpringBootTest(classes Application.class) public class ExtensionRegisterTest {Resourceprivate ExtensionRegister register;Resourceprivate ExtensionExecutor executor;Testpublic void test() {SomeExtPt extA new SomeExtensionA();register.doRegistration(extA);SomeExtPt extB CglibProxyFactory.createProxy(new SomeExtensionB());register.doRegistration(extB);executor.executeVoid(SomeExtPt.class, BizScenario.valueOf(A), SomeExtPt::doSomeThing);executor.executeVoid(SomeExtPt.class, BizScenario.valueOf(B), SomeExtPt::doSomeThing);}} public class CglibProxyFactory {public static T T createProxy(T object) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(object.getClass());enhancer.setCallback(new ProxyCallback(object));return (T) enhancer.create();}public static class ProxyCallback implements MethodInterceptor {private Object target;public ProxyCallback(Object target) {this.target target;}Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(ProxyObject::before);Object object proxy.invoke(target, args);System.out.println(ProxyObject::after);return object;}} } 2.主要技术点 2.1 注解加持 上述具体策略接口实现方法标注了扩展点注解Extension Inherited Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE}) Repeatable(Extensions.class) Component public interface Extension {String bizId() default BizScenario.DEFAULT_BIZ_ID;String useCase() default BizScenario.DEFAULT_USE_CASE;String scenario() default BizScenario.DEFAULT_SCENARIO; } 所有的具体实现方法都需要标注该注解表明该类属于一个扩展点同时由于标注了Component注解表明每一个扩展点也是一个bean实例 2.2 注解解析 扩展点注解的解析工作主要借助类ExtensionBootstrap和ExtensionRegister完成 Component public class ExtensionBootstrap implements ApplicationContextAware {Resourceprivate ExtensionRegister extensionRegister;private ApplicationContext applicationContext;PostConstructpublic void init(){MapString, Object extensionBeans applicationContext.getBeansWithAnnotation(Extension.class);extensionBeans.values().forEach(extension - extensionRegister.doRegistration((ExtensionPointI) extension));// handle Extensions annotationMapString, Object extensionsBeans applicationContext.getBeansWithAnnotation(Extensions.class);extensionsBeans.values().forEach( extension - extensionRegister.doRegistrationExtensions((ExtensionPointI) extension));}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;} } Component public class ExtensionRegister {/*** 扩展点接口名称不合法*/private static final String EXTENSION_INTERFACE_NAME_ILLEGAL extension_interface_name_illegal;/*** 扩展点不合法*/private static final String EXTENSION_ILLEGAL extension_illegal;/*** 扩展点定义重复*/private static final String EXTENSION_DEFINE_DUPLICATE extension_define_duplicate;Resourceprivate ExtensionRepository extensionRepository;public final static String EXTENSION_EXTPT_NAMING ExtPt;public void doRegistration(ExtensionPointI extensionObject) {Class? extensionClz extensionObject.getClass();if (AopUtils.isAopProxy(extensionObject)) {extensionClz ClassUtils.getUserClass(extensionObject);}Extension extensionAnn AnnotationUtils.findAnnotation(extensionClz, Extension.class);BizScenario bizScenario BizScenario.valueOf(extensionAnn.bizId(), extensionAnn.useCase(), extensionAnn.scenario());ExtensionCoordinate extensionCoordinate new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal ! null) {String errMessage Duplicate registration is not allowed for : extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}public void doRegistrationExtensions(ExtensionPointI extensionObject){Class? extensionClz extensionObject.getClass();if (AopUtils.isAopProxy(extensionObject)) {extensionClz ClassUtils.getUserClass(extensionObject);}Extensions extensionsAnnotation AnnotationUtils.findAnnotation(extensionClz, Extensions.class);Extension[] extensions extensionsAnnotation.value();if (!ObjectUtils.isEmpty(extensions)){for (Extension extensionAnn : extensions) {BizScenario bizScenario BizScenario.valueOf(extensionAnn.bizId(), extensionAnn.useCase(), extensionAnn.scenario());ExtensionCoordinate extensionCoordinate new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal ! null) {String errMessage Duplicate registration is not allowed for : extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}}//String[] bizIds extensionsAnnotation.bizId();String[] useCases extensionsAnnotation.useCase();String[] scenarios extensionsAnnotation.scenario();for (String bizId : bizIds) {for (String useCase : useCases) {for (String scenario : scenarios) {BizScenario bizScenario BizScenario.valueOf(bizId, useCase, scenario);ExtensionCoordinate extensionCoordinate new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal ! null) {String errMessage Duplicate registration is not allowed for : extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}}}}/*** param targetClz* return*/private String calculateExtensionPoint(Class? targetClz) {Class?[] interfaces ClassUtils.getAllInterfacesForClass(targetClz);if (interfaces null || interfaces.length 0) {throw new ExtensionException(EXTENSION_ILLEGAL, Please assign a extension point interface for targetClz);}for (Class intf : interfaces) {String extensionPoint intf.getSimpleName();if (extensionPoint.contains(EXTENSION_EXTPT_NAMING)) {return intf.getName();}}String errMessage Your name of ExtensionPoint for targetClz is not valid, must be end of EXTENSION_EXTPT_NAMING;throw new ExtensionException(EXTENSION_INTERFACE_NAME_ILLEGAL, errMessage);}} 最终将扩展点和决策条件的映射关系存储到ExtensionRepository中 Component public class ExtensionRepository {public MapExtensionCoordinate, ExtensionPointI getExtensionRepo() {return extensionRepo;}private MapExtensionCoordinate, ExtensionPointI extensionRepo new HashMap();} 2.3 扩展点路由 在实际业务场景调度过程中会调用ExtensionExecutor的方法locateExtension完成扩展点的查找最终执行扩展点逻辑 Component public class ExtensionExecutor extends AbstractComponentExecutor {private static final String EXTENSION_NOT_FOUND extension_not_found;private Logger logger LoggerFactory.getLogger(ExtensionExecutor.class);Resourceprivate ExtensionRepository extensionRepository;Overrideprotected C C locateComponent(ClassC targetClz, BizScenario bizScenario) {C extension locateExtension(targetClz, bizScenario);logger.debug([Located Extension]: extension.getClass().getSimpleName());return extension;}/*** if the bizScenarioUniqueIdentity is ali.tmall.supermarket* p* the search path is as below:* 1、first try to get extension by ali.tmall.supermarket, if get, return it.* 2、loop try to get extension by ali.tmall, if get, return it.* 3、loop try to get extension by ali, if get, return it.* 4、if not found, try the default extension** param targetClz*/protected Ext Ext locateExtension(ClassExt targetClz, BizScenario bizScenario) {checkNull(bizScenario);Ext extension;logger.debug(BizScenario in locateExtension is : bizScenario.getUniqueIdentity());// first try with full namespaceextension firstTry(targetClz, bizScenario);if (extension ! null) {return extension;}// second try with default scenarioextension secondTry(targetClz, bizScenario);if (extension ! null) {return extension;}// third try with default use case default scenarioextension defaultUseCaseTry(targetClz, bizScenario);if (extension ! null) {return extension;}String errMessage Can not find extension with ExtensionPoint: targetClz BizScenario: bizScenario.getUniqueIdentity();throw new ExtensionException(EXTENSION_NOT_FOUND, errMessage);}/*** first try with full namespace* p* example: biz1.useCase1.scenario1*/private Ext Ext firstTry(ClassExt targetClz, BizScenario bizScenario) {logger.debug(First trying with bizScenario.getUniqueIdentity());return locate(targetClz.getName(), bizScenario.getUniqueIdentity());}/*** second try with default scenario* p* example: biz1.useCase1.#defaultScenario#*/private Ext Ext secondTry(ClassExt targetClz, BizScenario bizScenario) {logger.debug(Second trying with bizScenario.getIdentityWithDefaultScenario());return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultScenario());}/*** third try with default use case default scenario* p* example: biz1.#defaultUseCase#.#defaultScenario#*/private Ext Ext defaultUseCaseTry(ClassExt targetClz, BizScenario bizScenario) {logger.debug(Third trying with bizScenario.getIdentityWithDefaultUseCase());return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultUseCase());}private Ext Ext locate(String name, String uniqueIdentity) {final Ext ext (Ext) extensionRepository.getExtensionRepo().get(new ExtensionCoordinate(name, uniqueIdentity));return ext;}private void checkNull(BizScenario bizScenario) {if (bizScenario null) {throw new IllegalArgumentException(BizScenario can not be null for extension);}}}
http://www.w-s-a.com/news/10843/

相关文章:

  • 中国著名的做网站渗透设计规范网站
  • 公司网站备案多少钱推特最新消息今天
  • 网站关键词设置代码seo搜索优化 指数
  • 做网站卖东西送上门做暧暧xoxo网站
  • 网站网站设计公司网站维护运营好做吗
  • 照片做成视频的软件seo两个域名一个网站有影响吗
  • 制作动画的网站河南省住房城乡建设门户网站
  • 网站推广原则做网站的那个语言好
  • 潍坊网站建设怎样商品网站建设设计思路
  • 建网站公司是如何赚钱南昌营销网站公司哪家好
  • 淘宝客网站管理质量好网站建设费用
  • 网站建设教程搭建青岛中企动力做网站怎么样
  • wordpress最底部网站优化怎么弄
  • 二手市场网站建设的目的长沙ui设计公司
  • 微信公众号做留言网站wordpress详情页选择模板
  • php网站开发面向对象教程如何做分享赚钱的网站
  • 山东网站建设最便宜常州网站建站公司
  • 网站地图 seo中国建设招标网是私人网站吗
  • 高中作文网站全网营销有哪些平台
  • 网站构建建设制作平台上海搬家公司收费价目表
  • 成功案例展示网站做网站赚多少钱
  • 建设银行网站用什么字体网站建站后维护需要做哪些
  • 有哪些做平面设计好素材网站有哪些开网站建设
  • 国际交流网站平台有哪些筑建网
  • 网站程序是如何开发的江门市住房建设管理局网站
  • 网站建设一般需要几个步骤昵图网免费素材
  • 个人网站建设需求说明书微信域名防封在线生成
  • 专业网站建设的公司wordpress后台没有模板
  • 哈尔滨网站运营服务商制作外贸网站公司
  • 个人网站需要备案宁波网站推广工具