2020-11-30

常见的设计模式及应用场景

一、单例模式

单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

使用场景:IO 、数据库连接、Redis 连接等。

单例模式代码实现:

class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance() {  return instance; }}

单例模式调用代码:

public class Lesson{ public static void main(String[] args) {  Singleton singleton1 = Singleton.getInstance();  Singleton singleton2 = Singleton.getInstance();  System.out.println(singleton1 == singleton2);  }}

程序的输出结果:true

可以看出以上单例模式是在类加载的时候就创建了,这样会影响程序的启动速度,那如何实现单例模式的延迟加载?在使用时再创建?

单例延迟加载代码:

// 单例模式-延迟加载版class SingletonLazy { private static SingletonLazy instance; public static SingletonLazy getInstance() {  if (instance == null) {   instance = new SingletonLazy();  }  return instance; }}

以上为非线程安全的,单例模式如何支持多线程?

使用 synchronized 来保证,单例模式的线程安全代码:

class SingletonLazy { private static SingletonLazy instance; public static synchronized SingletonLazy getInstance() {  if (instance == null) {   instance = new SingletonLazy();  }  return instance; }}

二、工厂模式
1,简单工厂

简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮(摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你的需求即可。

优点

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象;
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点

  • 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;
  • 产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。

简单工厂示意图如下:

简单工厂代码实现

class Factory { public static String createProduct(String product) {  String result = null;  switch (product) {   case "Mocca":    result = "摩卡";    break;   case "Latte":    result = "拿铁";    break;   default:    result = "其他";    break;  }  return result; }}

2,抽象工厂模式

抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让子类去做决定。

比如,以上面的咖啡工厂为例,某天我的口味突然变了,不想喝咖啡了想喝啤酒,这个时候如果直接修改简单工厂里面的代码,这种做法不但不够优雅,也不符合软件设计的"开闭原则",因为每次新增品类都要修改原来的代码。这个时候就可以使用抽象工厂类了,抽象工厂里只声明方法,具体的实现交给子类(子工厂)去实现,这个时候再有新增品类的需求,只需要新创建代码即可。

抽象工厂实现代码如下:

public class AbstractFactoryTest { public static void main(String[] args) {  // 抽象工厂  String result = (new CoffeeFactory()).createProduct("Latte");  System.out.println(result); // output:拿铁 }}// 抽象工厂abstract class AbstractFactory{ public abstract String createProduct(String product);}// 啤酒工厂class BeerFactory extends AbstractFactory{ @Override public String createProduct(String product) {  String result = null;  switch (product) {   case "Hans":    result = "汉斯";    break;   case "Yanjing":    result = "燕京";    break;   default:    result = "其他啤酒";    break;  }  return result; }}/\* \* 咖啡工厂 \*/class CoffeeFactory extends AbstractFactory{ @Override public String createProduct(String product) {  String result = null;  switch (product) {   case "Mocca":    result = "摩卡";    break;   case "Latte":    result = "拿铁";    break;   default:    result = "其他咖啡";    break;  }  return result; }}

观察者模式

观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 优点

  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色;
  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合;
  • 观察者模式支持广播通信;
  • 观察者模式符合开闭原则(对拓展开放,对修改关闭)的要求。

缺点

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间;
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

在观察者模式中有如下角色:

  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象;
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知;
  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己;
  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

观察者模式实现代码如下。

1)定义观察者(消息接收方)
/\* \* 观察者(消息接收方) \*/interface Observer { public void update(String message);}/\* \* 具体的观察者(消息接收方) \*/class ConcrereObserver implements Observer { private String name; public ConcrereObserver(String name) {  this.name = name; } @Override public void update(String message) {  System.out.println(name + ":" + message); }}
2)定义被观察者(消息发送方)
/\* \* 被观察者(消息发布方) \*/interface Subject { // 增加订阅者 public void attach(Observer observer); // 删除订阅者 public void detach(Observer observer); // 通知订阅者更新消息 public void notify(String message);}/\* \* 具体被观察者(消息发布方) \*/class ConcreteSubject implements Subject { // 订阅者列表(存储信息) private List<Observer> list = new ArrayList<Observer>(); @Override public void attach(Observer observer) {  list.add(observer); } @Override public void detach(Observer observer) {  list.remove(observer); } @Override public void notify(String message) {  for (Observer observer : list) {   observer.update(message);  } }}
3)代码调用
public class ObserverTest { public static void main(String[] args) {  // 定义发布者  ConcreteSubject concreteSubject = new ConcreteSubject();  // 定义订阅者  ConcrereObserver concrereObserver = new ConcrereObserver("老王");  ConcrereObserver concrereObserver2 = new ConcrereObserver("Java");  // 添加订阅  concreteSubject.attach(concrereObserver);  concreteSubject.attach(concrereObserver2);  // 发布信息  concreteSubject.notify("更新了"); }}

程序执行结果如下:

老王:更新了

Java:更新了

6.什么是装饰器模式?

答:装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象。

比如,创建一个对象"laowang",给对象添加不同的装饰,穿上夹克、戴上帽子......,这个执行过程就是装饰者模式,实现代码如下。

1)定义顶层对象,定义行为
interface IPerson { void show();}
2)定义装饰器超类
class DecoratorBase implements IPerson{ IPerson iPerson; public DecoratorBase(IPerson iPerson){  this.iPerson = iPerson; } @Override public void show() {  iPerson.show(); }}
3)定义具体装饰器
class Jacket extends DecoratorBase { public Jacket(IPerson iPerson) {  super(iPerson); } @Override public void show() {  // 执行已有功能  iPerson.show();  // 定义新行为  System.out.println("穿上夹克"); }}class Hat extends DecoratorBase { public Hat(IPerson iPerson) {  super(iPerson); } @Override public void show() {  // 执行已有功能  iPerson.show();  // 定义新行为  System.out.println("戴上帽子"); }}
4)定义具体对象
class LaoWang implements IPerson{ @Override public void show() {  System.out.println("什么都没穿"); }}
5)装饰器模式调用
public class DecoratorTest { public static void main(String[] args) {  LaoWang laoWang = new LaoWang();  Jacket jacket = new Jacket(laoWang);  Hat hat = new Hat(jacket);  hat.show(); }}

7.什么是模板方法模式?

答:模板方法模式是指定义一个模板结构,将具体内容延迟到子类去实现。

优点

  • 提高代码复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中;
  • 实现了反向控制:通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制并且符合开闭原则。

以给冰箱中放水果为例,比如,我要放一个香蕉:开冰箱门 → 放香蕉 → 关冰箱门;如果我再要放一个苹果:开冰箱门 → 放苹果 → 关冰箱门。可以看出它们之间的行为模式都是一样的,只是存放的水果品类不同而已,这个时候就非常适用模板方法模式来解决这个问题,实现代码如下:

/\* \* 添加模板方法 \*/abstract class Refrigerator { public void open() {  System.out.println("开冰箱门"); } public abstract void put(); public void close() {  System.out.println("关冰箱门"); }}class Banana extends Refrigerator { @Override public void put() {  System.out.println("放香蕉"); }}class Apple extends Refrigerator { @Override public void put() {  System.out.println("放苹果"); }}/\* \* 调用模板方法 \*/public class TemplateTest { public static void main(String[] args) {  Refrigerator refrigerator = new Banana();  refrigerator.open();  refrigerator.put();  refrigerator.close(); }}

程序执行结果:

开冰箱门

放香蕉

关冰箱门

8.什么是代理模式?

代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
  • 可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。

缺点

  • 由于使用了代理模式,因此程序的性能没有直接调用性能高;
  • 使用代理模式提高了代码的复杂度。

举一个生活中的例子:比如买飞机票,由于离飞机场太远,直接去飞机场买票不太现实,这个时候我们就可以上携程 App 上购买飞机票,这个时候携程 App 就相当于是飞机票的代理商。

代理模式实现代码如下:

/\* \* 定义售票接口 \*/interface IAirTicket { void buy();}/\* \* 定义飞机场售票 \*/class AirTicket implements IAirTicket { @Override public void buy() {  System.out.println("买票"); }}/\* \* 代理售票平台 \*/class ProxyAirTicket implements IAirTicket { private AirTicket airTicket; public ProxyAirTicket() {  airTicket = new AirTicket(); } @Override public void buy() {  airTicket.buy(); }}/\* \* 代理模式调用 \*/public class ProxyTest { public static void main(String[] args) {  IAirTicket airTicket = new ProxyAirTicket();  airTicket.buy(); }}

9.什么是策略模式?

答:策略模式是指定义一系列算法,将每个算法都封装起来,并且使他们之间可以相互替换。

优点:遵循了开闭原则,扩展性良好。

缺点:随着策略的增加,对外暴露越来越多。

以生活中的例子来说,比如我们要出去旅游,选择性很多,可以选择骑车、开车、坐飞机、坐火车等,就可以使用策略模式,把每种出行作为一种策略封装起来,后面增加了新的交通方式了,如超级高铁、火箭等,就可以不需要改动原有的类,新增交通方式即可,这样也符合软件开发的开闭原则。 策略模式实现代码如下:

/\* \* 声明旅行 \*/interface ITrip { void going();}class Bike implements ITrip { @Override public void going() {  System.out.println("骑自行车"); }}class Drive implements ITrip { @Override public void going() {  System.out.println("开车"); }}/\* \* 定义出行类 \*/class Trip { private ITrip trip; public Trip(ITrip trip) {  this.trip = trip; } public void doTrip() {  this.trip.going(); }}/\* \* 执行方法 \*/public class StrategyTest { public static void main(String[] args) {  Trip trip = new Trip(new Bike());  trip.doTrip(); }}

程序执行的结果:

骑自行车

10.什么是适配器模式?

答:适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

优点

  • 可以让两个没有关联的类一起运行,起着中间转换的作用;
  • 灵活性好,不会破坏原有的系统。

缺点:过多地使用适配器,容易使代码结构混乱,如明明看到调用的是 A 接口,内部调用的却是 B 接口的实现。

以生活中的例子来说,比如有一个充电器是 MicroUSB 接口,而手机充电口却是 TypeC 的,这个时候就需要一个把 MicroUSB 转换成 TypeC 的适配器,如下图所示:

适配器实现代码如下:

/\* \* 传统的充电线 MicroUSB \*/interface MicroUSB { void charger();}/\* \* TypeC 充电口 \*/interface ITypeC { void charger();}class TypeC implements ITypeC { @Override public void charger() {  System.out.println("TypeC 充电"); }}/\* \* 适配器 \*/class AdapterMicroUSB implements MicroUSB { private TypeC typeC; public AdapterMicroUSB(TypeC typeC) {  this.typeC = typeC; } @Override public void charger() {  typeC.charger(); }}/\* \* 测试调用 \*/public class AdapterTest { public static void main(String[] args) {  TypeC typeC = new TypeC();  MicroUSB microUSB = new AdapterMicroUSB(typeC);  microUSB.charger(); }}

程序执行结果:

TypeC 充电

11.JDK 类库常用的设计模式有哪些?

答:JDK 常用的设计模式如下:

1)工厂模式

java.text.DateFormat 工具类,它用于格式化一个本地日期或者时间。

public final static DateFormat getDateInstance();public final static DateFormat getDateInstance(int style);public final static DateFormat getDateInstance(int style,Locale locale);

加密类

KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");Cipher cipher = Cipher.getInstance("DESede");
2)适配器模式

把其他类适配为集合类

List<Integer> arrayList = java.util.Arrays.asList(new Integer[]{1,2,3});List<Integer> arrayList = java.util.Arrays.asList(1,2,3);
3)代理模式

如 JDK 本身的动态代理。

interface Animal { void eat();}class Dog implements Animal { @Override public void eat() {  System.out.println("The dog is eating"); }}class Cat implements Animal { @Override public void eat() {  System.out.println("The cat is eating"); }}// JDK 代理类class AnimalProxy implements InvocationHandler { private Object target; // 代理对象 public Object getInstance(Object target) {  this.target = target;  // 取得代理对象  return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  System.out.println("调用前");  Object result = method.invoke(target, args); // 方法调用  System.out.println("调用后");  return result; }}public static void main(String[] args) { // JDK 动态代理调用 AnimalProxy proxy = new AnimalProxy(); Animal dogProxy = (Animal) proxy.getInstance(new Dog()); dogProxy.eat();}
4)单例模式

全局只允许有一个实例,比如:

Runtime.getRuntime();
5)装饰器

为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。

java.io.BufferedInputStream(InputStream); java.io.DataInputStream(InputStream); java.io.BufferedOutputStream(OutputStream); java.util.zip.ZipOutputStream(OutputStream); java.util.Collections.checkedList(List list, Class type) ;
6)模板方法模式

定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。

比如,Arrays.sort() 方法,它要求对象实现 Comparable 接口。

class Person implements Comparable{ private Integer age; public Person(Integer age){  this.age = age; } @Override public int compareTo(Object o) {  Person person = (Person)o;  return this.age.compareTo(person.age); }}public class SortTest(){ public static void main(String[] args){  Person p1 = new Person(10);  Person p2 = new Person(5);  Person p3 = new Person(15);  Person[] persons = {p1,p2,p3};  //排序  Arrays.sort(persons); }}

12.IO 使用了什么设计模式?

答:IO 使用了适配器模式和装饰器模式。

  • 适配器模式:由于 InputStream 是字节流不能享受到字符流读取字符那么便捷的功能,借助 InputStreamReader 将其转为 Reader 子类,因而可以拥有便捷操作文本文件方法;
  • 装饰器模式:将 InputStream 字节流包装为其他流的过程就是装饰器模式,比如,包装为 FileInputStream、ByteArrayInputStream、PipedInputStream 等。

13.Spring 中都使用了哪些设计模式?

答:Spring 框架使用的设计模式如下。

  • 代理模式:在 AOP 中有使用
  • 单例模式:bean 默认是单例模式
  • 模板方法模式:jdbcTemplate
  • 工厂模式:BeanFactory
  • 观察者模式:Spring 事件驱动模型就是观察者模式很经典的一个应用,比如,ContextStartedEvent 就是 ApplicationContext 启动后触发的事件
  • 适配器模式:Spring MVC 中也是用到了适配器模式适配 Controller
 

 









原文转载:http://www.shaoqun.com/a/494417.html

燕文物流:https://www.ikjzd.com/w/2229

淘粉吧怎么返利:https://www.ikjzd.com/w/1725

瀚霖:https://www.ikjzd.com/w/2345


一、单例模式单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。优点:不会频繁地创建和销毁对象,浪费系统资源。使用场景:IO、数据库连接、Redis连接等。单例模式代码实现:classSingleton{privatestaticSingletoninstance=newSingleton();publicstaticSingle
terapeak:terapeak
gem:gem
2020年深圳世界之窗门票是多少?:2020年深圳世界之窗门票是多少?
加拿大温哥华旅游购物攻略:加拿大温哥华旅游购物攻略
最适合端午节的10大人少好玩的冷门目的地:最适合端午节的10大人少好玩的冷门目的地

DevOps Workshop | 代码管理入门:基于代码扫描实现团队效率提升

CODING「DevOps Workshop 学习营地」持续火热进行中!

在这里,你可以轻松实践 DevOps 全流程、体验高效的云端开发、赢取精美礼品——第二期大奖「戴尔 U2718Q 显示器」将于 12 月 3 日开奖,请尽快前往 CODING,完成任务参与抽奖,iPad Pro、HHKB 键盘和 Bose 耳机等礼品均有机会获得!也可以根据 CODING 最佳实践系列文章,探索更多新玩法。

「DevOps Workshop 学习营地」活动链接
https://workshop.coding.io
点击直达,在 PC 端浏览器中打开体验更佳

接下来,开始阅读本篇 CODING 代码管理能力之「代码扫描」最佳实践吧!


CODING 代码扫描通过分析代码仓库中的源代码,能够及时发现其中潜藏的代码缺陷、安全漏洞以及不规范代码。

  • 代码扫描内部目前集成了几十种工具、数千条规则,支持十余种常用开发语言,可在功能、安全、性能、可用性、代码规范等多个维度寻找您代码中的漏洞并提供修改建议。
  • 责任人自动指派问题代码提交人,问题代码修复后可自行关闭,实现问题的闭环处理。
  • 为了便于您的使用,系统内置了多种推荐扫描方案,也支持您按需定制。
  • 支持自动化执行代码扫描:您可以通过设置触发规则,指定合适的时机比如合并请求时自动执行代码扫描。
  • 支持对仓库的多个分支进行全量或增量的扫描。

实践—辅助代码评审

在团队的开发协作中,为把控工程质量,推荐在合并场景中进行代码评审。但仅采用人工审查的方式,往往需要耗费大量时间与精力,使用代码扫描可自动扫描源分支生成扫描结果,并根据扫描结果自动拦截问题代码的合入,防止目标分支被污染,提升代码评审效率。

配置扫描任务

新建扫描任务

选定需管控代码质量的仓库及分支,以及拟使用的扫描方案,即可创建扫描任务。

1

配置触发规则

在扫描任务中点击设置,轻点触发规则即可看到代码仓库触发设置。

2

配置质量门禁

开启后,建议将致命问题和错误问题阈值设置为 0,其一般为影响系统稳定和安全的严重漏洞。

3

开启「管控合并请求」开关后,无论是否为保护分支,合并至此分支的所有合并请求必须通过质量门禁后才允许合并。

代码扫描如何用于辅助代码评审

合并请求触发扫描

按照上文所述配置好分支的扫描任务后开启「管控合并请求」,向该分支新建合并请求时将自动触发代码扫描,若不通过质量门禁将自动拦截禁止合入。

您可以在合并请求详情中,查看问题概览、问题报告来了解代码质量。

4

查看问题报告

点击查看问题报告,可以看到本次扫描后的所有问题,每个问题都有与之对应的所属文件、问题所匹配的规则、问题级别等内容。

5

查看问题详情

点击查看问题,可以看到问题的位置与错误原因,点击右侧的修复建议可以查看问题原因并辅助进行修复。

示例:sql 注入警告

6

修复问题后重新推送

建议按照问题级别依次修复扫描出的问题,在本地修复完成后可提交至源分支,将自动触发代码扫描。

总结

通过上述方式配置代码扫描,可帮助团队在合并请求的场景中有效的管控代码质量,并提升团队对代码评审的效率和积极性,进而提升整个团队的工程质量。

  • 对于提交者,代码扫描可以提前发现自己的问题,及时修正以避免合并请求被拒绝。
  • 对于评审者,代码扫描不仅可以通过扫描结果辅助代码评审,还能够自动拦截问题代码的合入。
  • 对于团队,有了代码扫描可以在日常工作中提前发现问题代码,提高代码评审的效率,降低项目交付上线时存在的风险。

点击前往活动,「DevOps Workshop 学习营地」大奖等你赢!









原文转载:http://www.shaoqun.com/a/494402.html

墩煌网:https://www.ikjzd.com/w/189

focalprice:https://www.ikjzd.com/w/1094.html

extra:https://www.ikjzd.com/w/1736


CODING「DevOpsWorkshop学习营地」持续火热进行中!在这里,你可以轻松实践DevOps全流程、体验高效的云端开发、赢取精美礼品——第二期大奖「戴尔U2718Q显示器」将于12月3日开奖,请尽快前往CODING,完成任务参与抽奖,iPadPro、HHKB键盘和Bose耳机等礼品均有机会获得!也可以根据CODING最佳实践系列文章,探索更多新玩法。「DevOpsWorkshop学习营地
e票联:e票联
kk馆:kk馆
如今的亚马逊打造一款产品究竟要花多少钱?:如今的亚马逊打造一款产品究竟要花多少钱?
亚马逊定价公式是什么?有何技巧定价内容分享?:亚马逊定价公式是什么?有何技巧定价内容分享?
肇庆九龙湾漂流自驾游路线如何安排呢?:肇庆九龙湾漂流自驾游路线如何安排呢?

SpringBoot整合阿里短信服务

导读

  由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达)、短信、公众号(点我直达)等推送功能,网上学习下,整理下来以备以后使用。

步骤

  点我直达

登录短信服务控制台

  点我直达

开通短信服务

快速学习

测试短信发送

发送短息

  报一下错误信息

抱歉!发送出错了。错误码Code:isv.AMOUNT_NOT_ENOUGH。建议前往"短信接口调用错误码"帮助文档,根据错误码查询错误原因及建议。

查看错误码显示,提示余额不足,先充点钱进去

  账户里充点钱进去,我充了3元

再次发送消息

收到的短信测试消息

查看demo

查看sdk

添加依赖即java代码示例

注意事项

  签名和短信模板自己添加!!!!!点我直达

具体请求参数,请查阅API文档

创建AccessKey和AccessSercet

  相当于用户的身份标识,项目中需要用到~

SpringBoot代码实现

添加依赖

  <dependency>   <groupId>com.aliyun</groupId>   <artifactId>aliyun-java-sdk-core</artifactId>   <version>4.4.6</version>  </dependency>  <dependency>   <groupId>com.aliyun</groupId>   <artifactId>aliyun-java-sdk-ecs</artifactId>   <version>4.17.6</version>  </dependency>

<??><project ="http://maven.apache.org/POM/4.0.0" ="http://www.w3.org/2001/   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.2.11.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ybchen</groupId> <artifactId>springboot-sms</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-sms</name> <description>SpringBoot整合阿里短信服务</description> <properties>  <java.version>1.8</java.version> </properties> <dependencies>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>   <exclusions>    <exclusion>     <groupId>org.junit.vintage</groupId>     <artifactId>junit-vintage-engine</artifactId>    </exclusion>   </exclusions>  </dependency>  <!--阿里短信服务-->  <dependency>   <groupId>com.aliyun</groupId>   <artifactId>aliyun-java-sdk-core</artifactId>   <version>4.4.6</version>  </dependency>  <dependency>   <groupId>com.aliyun</groupId>   <artifactId>aliyun-java-sdk-ecs</artifactId>   <version>4.17.6</version>  </dependency> </dependencies> <build>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>  </plugins> </build></project>

pom.

控制层

package com.ybchen.springbootsms.controller;import com.aliyuncs.CommonRequest;import com.aliyuncs.CommonResponse;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.exceptions.ServerException;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;/** * @ClassName:SmsController * @Description:TODO * @Author:chenyb * @Date:2020/11/30 10:59 上午 * @Versiion:1.0 */@RestControllerpublic class SmsController { @GetMapping("sendSms") public Object sendSms(){  //区域id、accessKeyId、secret  DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GDpBasmRFrABc8oNLNm", "FZ8hqtLe8xeh1Nb285olKBL5lBiX9F");  IAcsClient client = new DefaultAcsClient(profile);  CommonRequest request = new CommonRequest();  request.setSysMethod(MethodType.POST);  request.setSysDomain("dysmsapi.aliyuncs.com");  request.setSysVersion("2017-05-25");  request.setSysAction("SendSms");  //区域id  request.putQueryParameter("RegionId", "cn-hangzhou");  //发送的手机号  request.putQueryParameter("PhoneNumbers", "199500000000");  //签名  request.putQueryParameter("SignName", "ABC商城");  //模板  request.putQueryParameter("TemplateCode", "SMS_205887565");  //数据,json格式替换短信模板的内容  request.putQueryParameter("TemplateParam", "{\"code\":\"9999\"}");  CommonResponse response = null;  try {   response = client.getCommonResponse(request);   System.out.println(response.getData());  } catch (ServerException e) {   e.printStackTrace();  } catch (ClientException e) {   e.printStackTrace();  }  return response; }}

发送短信

错误码文档

  点我直达

APIdemo调试

  点我直达









原文转载:http://www.shaoqun.com/a/494394.html

easel:https://www.ikjzd.com/w/1721

飞书互动:https://www.ikjzd.com/w/1319.html

淘粉吧首页:https://www.ikjzd.com/w/1725.html


导读  由于最近手头上需要做个MessageGateway,涉及到:邮件(点我直达)、短信、公众号(点我直达)等推送功能,网上学习下,整理下来以备以后使用。步骤  点我直达登录短信服务控制台  点我直达开通短信服务快速学习测试短信发送发送短息  报一下错误信息抱歉!发送出错了。错误码Code:isv.AMOUNT_NOT_ENOUGH。建议前往"短信接口调用错误码"帮助文档,根据错误码查询错误原因
亚马逊全球开店制造:亚马逊全球开店制造
瀚霖:瀚霖
钟山在哪个省_钟山在哪里_江苏南京钟山景区怎么走 :钟山在哪个省_钟山在哪里_江苏南京钟山景区怎么走
拉萨购物小贴士:拉萨购物小贴士
珠海有什么好玩的地方?:珠海有什么好玩的地方?

干货!亚马逊listing转化率优化系列:怎样优化listing图片?

干货!亚马逊listing转化率优化系列:怎样优化listing图片?

看到你的产品在亚马逊上表现不佳会令人很沮丧,你甚至可能开始质疑你的产品。但很可能你的产品根本没有问题,而可能是由于文案、图片或评论的问题。

分析转化率可以帮助你优化listing。本系列文章将提供有关提高亚马逊转化率的方法。但是在深入探讨之前,你需要了解为什么你应该更关注转化率?

更高的转化率能够:

1、带来更多销售

更多转化=更多销售。除非你的转化率很高,否则无论你在PPC上花费多少钱都不会带来结果。因为投放PPC广告,你可以将流量带到你的详情页,但是如果客户不准备购买,那么花在引流上的钱都是做无用功。在投放广告之前,你需要让你的产品为流量做好准备,因为转化率是决定你的销售量的因素。

2、提高自然排名

尽管赞助广告的主导地位不断提高,但自然排名是收入增长不可或缺的部分。但是就像Google的算法一样,没人真正知道A9算法的工作原理。但是,亚马逊确实提供了一些见解:"诸如文本匹配程度、价格、库存量、和销售历史记录之类的因素有助于确定你的产品在客户搜索结果中的位置。"销售历史是各种指标(例如订单缺陷率)中的重要元素。排名上的优势与销售历史,尤其是转化率直接相关,因为转化率的提高=销售额的增长。

3、增加商品曝光

这是转化率提升后的一个经常被忽视的好处。在产品页面上,有多个部分可以突出显示竞争对手的产品。例如"Best sellers"、"Customers Also Viewed"部分和"Compare with Similar Items"部分。这些都是很理想的展示位且变动很频繁。想象一下,如果你的产品获得其中之一的展示位,就会获得大量展示和曝光。

4、在赞助广告竞价中获得优势

更高的转化率等于更低的获客成本,因此在赞助广告竞价中也提供了竞争优势。对于一个关键字对应多个产品广告的广告,亚马逊会更青睐,该广告具有更高的历史转化率,即使每次点击费用出价低于竞争对手。因为客户满意度高于一切。节省下来的钱可以再投资以扩大广告系列或用于其他营销活动。什么样的转化率才算好?根据一项研究,非Prime的平均转化率约为13%,而Prime的平均转化率高达74%。亚马逊卖家比其他卖家具有竞争优势,因为客户已经有购物意愿,因此转化率自然要高得多。

研究表明,其他在线销售网站上的购物者转化率仅为3.32%。问题是,亚马逊平台的理想转化率是多少?尽管"好的"转化率根据产品、类别和价格的变化而定,但如果你的产品的转化率达到20%或更高,那将是理想的数字。那么该如何提高亚马逊listing的转化率?

你的转化率与你所提供的客户体验直接相关。PPC广告和排名与使用正确的关键词以及满足A9算法的要求有关,而转化率则是与满足客户需求有关。

在以下情况下,客户将感到高兴:

(a)回答了他所有的问题;

(b)他认为你的品牌值得信赖;

(c)他获得了进行购买所需的所有信息;

(d)他认为不需要亲自查看产品;

假设你是一家实体店的所有者。当客户进入你的商店时,他将有几个问题;如果所有问题都得到了回答,并且他确信你的产品是他所能买到的较优选择,那么他将进行购买,否则将不会。那么,如果你没有实体店,你将如何证明你的产品是最好的?

这是当你在亚马逊上出售时发生的情况。你无法面对面说服客户,因此客户将不得不依靠其他因素做出决定。这些其他因素是在客户心中建立信任和信心并影响转化率的原因。在线购物时,你会先查看图像,然后向下滚动以阅读评论,你还会查看A +页面,然后阅读文案以获取重要的产品信息。

因此,listing页面上影响转化率的主要因素之一是图片:图片优化图像是提高转化率的重要因素之一,图片使查看和消化复杂的信息更为轻松。此外,如果listing图片够好,客户会觉得你是一个专业和值得信赖的品牌。购物者可能不会费心阅读文案,但是他们一定会查看你上传的每张图像。

所以,不用说图像优化应该是你的重中之重。以下是每个卖家的listing图片需要具备的一些要素。 

8个提高转化率的图像要素:

1、产品外观很棒的图片(主图)

要创建出色的主图像,你不仅需要剪切背景,你还要消除摄影上的不足。即使你在摄影棚中拍摄产品,也一定会出现瑕疵。闪光、皱纹、阴影、颜色和照明差异是常见且不可避免的。因此,为避免这种情况,你应该编辑照片并删除任何使其显得不专业的元素。该图像将成为你的主图像。如果你的主图像看起来很完美,则点击率也会提高。以下是主图中要注意的一些常见事项:

· 至少应为1500 x 1500像素;

· 应该清晰且高质量;

· 应该尽可能多地占用图片空间;

· 应该使用纯白色背景;

2、优化生活方式图片:

在生活方式的图像中使用额外的空间,使其看起来更具冲击力。在生活方式图像中添加相关标语是增加该图像价值的好方法。想象一下一个人在山峰上扛着远足杖的图片,上面有标语"Reach great heights"。只有生活方式的图片显然不能够带来这样的感觉。与客户建立联系并解释其给购物者带来的便利的句子可以为你的图片加分不少。 

3、包含评论内容的图片:

购物者百分百会查看评论,但他们只会粗略浏览。大多数购物者仅仅只会查看星级、阅读一两个受欢迎的评论。如果可以在图像本身中突出显示一两个评论,那不是很好吗?只需阅读图片中的评论,即可使他们对购物更有信心,还可以减少负面评论对他们的影响。如果你在亚马逊上还没有任何评论,则可以突出显示你在其他网站上获得的一些评论。

4、包含承诺的图片:

很多在线购物者都经历过糟糕的购买体验,作为卖家,你可以通过展示满意保证或保修的图像来减轻对客户的此类疑问。同样,你不能将客户满意度声明添加到A+页面中,因此此图像必须使其进入图像网格。只要确保突出售后支持以及在出现这种情况时兑现承诺即可。 

5、说明产品优势的图片:

其他所有卖家都在销售与你类似的商品,因此购物者将把你的商品与其他十种商品进行比较。你可以通过制作一个比较表,清楚地说明为什么你的产品是他们的正确选择。你可以考虑使用购物者进行比较所使用的重要指标,然后强调你的产品拥有所有这些指标,而竞争对手只有其中的一些(或根本没有)。制作比较表可以提高客户的信心,并在一处突出显示产品的所有功能。

6、说明产品好处的图片:

让客户知道你的产品可以给他们的生活带来便利。大多数时候,客户对技术规范不感兴趣,而是更关注更容易理解的产品好处。使用此图像,你可以展示客户购买产品后将获得的所有好处。

7、说明质量保障的图片:

购物者在网上购买产品时关心"质量"。在实体店中,他们可以自己感觉和触摸产品并评估质量,但是在网上购买时,他们却没有这种能力。质量保证的图片是增加他们信任感的原因,向客户展示这类图片可以让他们做出明智和自信的购买决定。

8、突出主要卖点的图片:

每个产品都有其独特的卖点。确定你的卖点并将其显示在图像中。突出你的USP可以使你在竞争对手中看起来与众不同,并且可以回答客户的常见问题:我们为什么要选择你?每个产品都有其独特之处。制作"卖点图"是突出显示独特之处的好方法。


来源:跨境风暴

文章来源:https://www.ikjzd.com/home/135272

拍拍购物:https://www.ikjzd.com/w/2205

贝贝官网:https://www.ikjzd.com/w/1321

wario:https://www.ikjzd.com/w/887

识货:https://www.ikjzd.com/w/1745

tiki:https://www.ikjzd.com/w/2053

干货!亚马逊listing转化率优化系列:怎样优化listing图片?

看到你的产品在亚马逊上表现不佳会令人很沮丧,你甚至可能开始质疑你的产品。但很可能你的产品根本没有问题,而可能是由于文案、图片或评论的问题。

《隐秘而伟大》大结局有哪些梗?齐副局长死得冤,孔科长全剧最佳

原标题:《隐秘而伟大》大结局有哪些梗?齐副局长死得冤,孔科长全剧最佳

《隐秘而伟大》大结局毫无悬念,沈青禾回归与小警察顾耀东再续前缘,夏处长断臂求生继续执行秘密任务。相比之下,"变色龙"齐副局长的死略不合理,"大头"肖德荣的回归最让人意外。

先从齐副局长说起,他算得上全剧的"变色龙",对外界环境的感知极为敏感。当年在刑警二处夏继成和沈青禾联手可没少给他捞好处,但在莫干山事件中察觉到顾耀东可能有问题,即使知道夏继成对顾耀东另眼相待,他也没有丝毫要帮忙的意思,下令让王科达秉公处理,还刻意撇清关系。

夏继成高升,临走半托孤,他对顾耀东依然故我,只在夏继成从南京为他寻来一船宝贝时,稍微转了措辞,让顾耀东的日子不那么难捱。等到最后看透顾耀东的身份,他又话里有话地点顾耀东,想为自己留后路,这些都说明齐副局长是个重利但又识时务的人。

尤其在警察局长争夺战中,他的这番眼力见就更明显。眼看钟百鸣有田副署长撑腰,自己的地位不保,关键时刻他撇开想送顺水人情进行利益交换的段局长,直接找到唐总署长表忠心,可见他是个能抓住要害的"聪明人"。

一个细节最能体现齐副局长的特质。钟百鸣怀疑夏继成有问题,在没有定论之前,他立马让秘书取下夏继成送的字画,但探听到夏继成证明了自己的清白准备到警局来问责时,他又立马让秘书将字画挂了回去。这样的骚操作实在叫人叹为观止。

他对局势的认识也很到位。在国民党时期,自知升迁希望不大的他,唯段局长的马首是瞻,凡事都要考虑局长是不是要怪罪,是不是不高兴,剩下的精力全部用来敛财。等局长之位落空,预料到要"变天",他一面在台上发表慷慨激扬的鼓励词,一面向顾耀东示好留后手,一面又立马安排夫人去台湾避难,可见他的能力。

但就是这样一个识时务又有应变能力的官场老油条,在准备逃离之际,居然会因为钱多钱少的问题跟一群兵痞示威,还妄图用上海市警察局副局长的身份压人,实在叫人不能理解。按照他的段位,应该很容易看出对方的需求,就算明知自己要吃亏也应该软下来趁机逃走,断不该就这么不明不白的冒着暴露的风险掏枪示威,这点让小编极为不理解。

除了齐副局长,肖大头的回归也让人意外。在刑警二处,一开始最针对顾耀东的就是肖大头,不是嫌弃顾耀东毁了自己的奖金,就是嫌他给二处丢脸,虽然后来夏处长离开后,他也多次出口维护顾耀东,但肖德荣从未提过自己的理想。但在大结局中,刑警二处仅剩的四名警员在天台喝酒畅聊,他居然唏嘘自己当年当警察也是有理想的,并透露出自己愿意坚持梦想。而等到解放后,也是他毅然决定回归,继续当警察。"老油条"肖德荣的真情告白虽然有点酸,但其实还是挺动人的,这个小人物的人设也算是立住了。

但要数整部剧的"聪明人"排行,户籍科的孔科长排榜首肯定没啥争议。从夏继成时代就以下棋为名,睁一只眼闭一只眼帮忙倒腾户籍证明,到顾耀东留守时,当着钟百鸣的面维护,孔科长肯定是很早就洞悉了白桦真实身份的人。但他始终不动声色的在帮忙,与其说这是理想使然,倒不如说是一种高明的自保手段。

就像后来他跟顾耀东说的那样,任何时代都需要户籍警察,他作为一个老户籍警察是会被需要的,而且到了后期他也愿意敞开自己的心扉,说出了对人民有利类似的话,可见他在洞悉世事的同时也还是会抓时机和有内心坚守的。这样一个聪明人最后在解放后继续为人民服务,也算是物尽其用了。孔科长作为老江湖,当得起全剧最聪明人的称呼。文/红皇后返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/209071.html

gtc:https://www.ikjzd.com/w/974

reverb:https://www.ikjzd.com/w/1273

派代:https://www.ikjzd.com/w/2197


原标题:《隐秘而伟大》大结局有哪些梗?齐副局长死得冤,孔科长全剧最佳《隐秘而伟大》大结局毫无悬念,沈青禾回归与小警察顾耀东再续前缘,夏处长断臂求生继续执行秘密任务。相比之下,"变色龙"齐副局长的死略不合理,"大头"肖德荣的回归最让人意外。先从齐副局长说起,他算得上全剧的"变色龙",对外界环境的感知极为敏感。当年在刑警二处夏继成和沈青禾联手可没少给他捞好处,但在莫干山事件中察觉到顾耀东可能有问题,即
tinypic:tinypic
telegram:telegram
广西百鸟岩好玩吗?:广西百鸟岩好玩吗?
E邮宝:E邮宝
东莞水上乐园有哪些?东莞去哪里玩水?:东莞水上乐园有哪些?东莞去哪里玩水?

圣诞大促倒计时1个月,跨境热门选品和侵权高发品早知道!

圣诞大促倒计时1个月,跨境热门选品和侵权高发品早知道!

距离圣诞节来临还有一个月的时间,作为国外的重大节日之一,在今年疫情泛滥、多地封城的影响之下,很多消费者在此时开始开始了圣诞节的相关筹备。

除了人们熟知的圣诞树,还有哪些圣诞潜力好品呢?小编为大家整理了一些圣诞节优质选品,卖家圣诞节选品的时候要注意了。

1、圣诞节贺卡

圣诞过节的时候一般都会赠送贺卡寄托祝福,对于贺卡的使用率非常高。加上今年疫情的侵袭,在他们最重视的圣诞节面前,贺卡更是不可或缺。

以美国站为例,圣诞贺卡相关的关键词在近30天和近90天的搜索量均属于大幅上升趋势,最高搜索量增长已达2233%。

6e1c0209802a1a1831c68db1f95ee69003752294.png

2、圣诞节口罩

在今年的疫情影响下,口罩的销量还是非常不错的,加上疫情反扑,人们对于口罩的需求量大幅上涨。随着圣诞节的来临,圣诞节主题的口罩用品势必也是一大销量热门。

在相关关键词分析网站上,圣诞口罩相关关键词的搜索量也在不断上升。

da0e22dea387ac88d44e69018e3ac442539d5288.png

3、圣诞树装系列饰品

圣诞节自然少不了圣诞树的,那么关于圣诞树的一些列装饰品就成了卖家的新商机。

"圣诞树装饰品"及其相关关键词在的搜索量目前仍处于一路飙升之中。

7bd6cf1465454a6f11f919fea37611bd5f6cc984.png

4、姜饼屋制作套装

欧洲圣诞节的节日习俗之一便是父母和孩子共同动手制作姜饼屋,所以这类套装在国外家庭非常受欢迎。

除了这几类产品之外,圣诞睡衣、袜子、包装袋、贴纸、蜡烛等都是目前非常受欢迎的几类热卖产品,但是小编在这里提醒各位卖家,圣诞相关产品季节性较强,在备货方面要合理考虑哦。

4a3b3e406f1701fd7ff143ccb47de8cbea5f87f3.png

除了这些热门选品,又有哪些圣诞相关的侵权坑值得我们注意的呢?

Cuddle Barn圣诞玩具系列

CuddleBarn这个品牌是美国新兴的玩具品牌,会说话会跳舞的毛绒玩具独树一帜,十分深厚小朋友的喜爱,销量十分喜人。但是据小编了解,这个品牌旗下的所有玩具产品包括圣诞主题的都已经被注册了版权,在未经授权的情况之下不得随意使用。

39b8d2f03a64a804f2e2e891de50e518d1eeb683.jpeg124a93785c74a1ee46794e53ea51984ea9e78404.jpeg


圣诞树diy手绘装饰品

此款圣诞diy装饰品在圣诞树的基础上利用转轴添加了一颗可旋转圆球,可以用彩笔在上方自由绘画,目前已在美国站被注册了发明专利。

66f69b44321107a93254dfd159dc97f541b54015.jpeg

圣诞精灵小火车

圣诞主题玩具一直都是节日销量热门,如图所示的精灵小火车,在圣诞元素的基础上,标上相应数字,既能满足小朋友的玩乐需求同时也将数字早教融入其中。

ef1398ffef66d21c2b919c66c1f43c05983c6d7d.jpeg


但是据小编了解,此款玩具属于版权归THEELF ON THE SHELF所有,并且目前已被律所代理,各位卖家千万不要触碰这条侵权红线。


来源:吉特申诉

文章来源:https://www.ikjzd.com/home/135345

r标:https://www.ikjzd.com/w/1070

国际标准书号:https://www.ikjzd.com/w/174

好卖家:https://www.ikjzd.com/w/776

jpgoodbuy:https://www.ikjzd.com/w/1553

丰趣海淘:https://www.ikjzd.com/w/1716

圣诞大促倒计时1个月,跨境热门选品和侵权高发品早知道!

新冠肺炎疫情爆发以来,自行车成为国内外最受欢迎的交通工具之一。据国内媒体报道,随着境外新冠病毒感染人数的再度飙升,全球范围内选择自行车出行和健身的人群大幅增长,加上部分国家政府的补贴与鼓励,中国自行车海外销量出现了激增。阿里国际站数据显示,中国第三季度自行车出口继续保持增长态势,