Runnable fly = () -> System.out.println(" ");
fly.run();
package patterns.and.lambdas.ducks; import java.util.concurrent.ConcurrentSkipListMap; /** * . * * @param <T> * : Runnable, Callable<V>, Supplier<T>, BooleanSupplier, * Consumer<T>, BiConsumer<T,U>, Predicate<T>, BiPredicate<T,U>, Function<T,R>, * BiFunction<T,U,R>, UnaryOperator<T>, BinaryOperator<T>, * {@link java.util.function} . */ public class BehaviorRegistry<T> { public ConcurrentSkipListMap<String, T> map = new ConcurrentSkipListMap<>(); public void add(final String behaveName, final T behaveFunc) { this.assertContainsNameNot(behaveName); BehaviorRegistry.assertArgNotNull(behaveFunc); this.map.put(behaveName, behaveFunc); } public boolean contains(final String behaveName) { BehaviorRegistry.assertArgNotNull(behaveName); this.assertMapNotNull(); return this.map.containsKey(behaveName) && (this.map.get(behaveName) != null); } public T get(final String behaveName) { this.assertContainsName(behaveName); return this.map.get(behaveName); } public void replace(final String behaveName, final T behaveFunc) { this.assertContainsName(behaveName); BehaviorRegistry.assertArgNotNull(behaveFunc); this.map.put(behaveName, behaveFunc); } public void remove(final String behaveName) { this.assertContainsName(behaveName); this.map.remove(behaveName); } protected static void assertArgNotNull(final Object arg) { if ((arg instanceof String) && !"".equals(arg)) return; if (arg != null) return; throw new RuntimeException(" ."); } protected void assertContainsName(final String behaveName) { BehaviorRegistry.assertArgNotNull(behaveName); this.assertMapNotNull(); if (!this.contains(behaveName)) { throw new RuntimeException(" \"" + behaveName + "\" ."); } } protected void assertContainsNameNot(final String behaveName) { BehaviorRegistry.assertArgNotNull(behaveName); this.assertMapNotNull(); if (this.contains(behaveName)) { throw new RuntimeException(" \"" + behaveName + "\" ."); } } protected void assertMapNotNull() { if (this.map == null) throw new RuntimeException(" map."); } }
package patterns.and.lambdas.ducks; public class Duck { protected BehaviorRegistry<Runnable> behaviors = new BehaviorRegistry<>(); public void perform(final String behaveName) { this.behaviors.get(behaveName).run(); } /** * . */ public void performAll() { this.behaviors.map.descendingKeySet().forEach(this::perform); System.out.println("----------------------------------------------"); } }</nobr>
package patterns.and.lambdas.ducks; import java.util.function.BiConsumer; /** * . */ public enum EBehaviors { Display("", () -> System.out.println(" ")), Fly("", () -> System.out.println(" ")), Sleep("", () -> System.out.println("Zzzz")), Quack("", () -> System.out.println("--")), Propagate("", () -> System.out.println("O_o")); public String name; public Runnable func; private EBehaviors(final String m_name, final Runnable m_func) { this.name = m_name; this.func = m_func; } public void sendTo(final BiConsumer<String, Runnable> someApiFunction) { someApiFunction.accept(this.name, this.func); } public void sendTo(final BiConsumer<String, Runnable> someApiFunction, final Runnable m_func) { someApiFunction.accept(this.name, m_func); } }
package patterns.and.lambdas.ducks; import java.util.stream.Stream; import patterns.and.lambdas.ducks.Duck; import patterns.and.lambdas.ducks.EBehaviors; public class Test { public static void main(final String[] args) { Runnable behaviorFunc = null; final Duck mallardDuck = new Duck(); behaviorFunc = () -> System.out.println(" "); EBehaviors.Display.sendTo(mallardDuck.behaviors::add, behaviorFunc); EBehaviors.Fly.sendTo(mallardDuck.behaviors::add); EBehaviors.Quack.sendTo(mallardDuck.behaviors::add); final Duck redheadDuck = new Duck(); behaviorFunc = () -> System.out.println(" "); EBehaviors.Display.sendTo(redheadDuck.behaviors::add, behaviorFunc); EBehaviors.Fly.sendTo(redheadDuck.behaviors::add); EBehaviors.Quack.sendTo(redheadDuck.behaviors::add); final Duck rubberDuck = new Duck(); behaviorFunc = () -> System.out.println(" "); EBehaviors.Display.sendTo(rubberDuck.behaviors::add, behaviorFunc); EBehaviors.Quack.sendTo(rubberDuck.behaviors::add); final Duck decoyDuck = new Duck(); behaviorFunc = () -> System.out.println(" "); EBehaviors.Display.sendTo(decoyDuck.behaviors::add, behaviorFunc); final Duck exclusiveDuck = new Duck(); behaviorFunc = () -> System.out.println(" "); EBehaviors.Display.sendTo(exclusiveDuck.behaviors::add, behaviorFunc); behaviorFunc = () -> System.out.println(" <== "); exclusiveDuck.behaviors.add(" ", behaviorFunc); final Duck[] ducks = { mallardDuck, redheadDuck, rubberDuck, decoyDuck, exclusiveDuck }; // . System.out.println("############################################## 1"); Stream.of(ducks).forEachOrdered(Duck::performAll); // . System.out.println("############################################## 2"); behaviorFunc = () -> System.out.println("! <== RunTime"); EBehaviors.Display.sendTo(redheadDuck.behaviors::replace, behaviorFunc); redheadDuck.performAll(); // . System.out.println("############################################## 3"); EBehaviors.Propagate.sendTo(mallardDuck.behaviors::add); EBehaviors.Sleep.sendTo(mallardDuck.behaviors::add); mallardDuck.behaviors.map.forEach((name, func) -> { final Runnable newFunc = () -> { func.run(); System.out.println(" ^^^^^ "); }; mallardDuck.behaviors.replace(name, newFunc); }); mallardDuck.performAll(); // , . System.out.println("############################################## 4"); for (final Duck duck : ducks) { Stream.of(EBehaviors.values()).map(val -> val.name).filter(duck.behaviors::contains) .forEach(duck.behaviors::remove); } Stream.of(ducks).forEachOrdered(Duck::performAll); } }
############################################## one I mallard I fly Quack quack quack ---------------------------------------------- I'm a red headed duck I fly Quack quack quack ---------------------------------------------- I'm a rubber duck Quack quack quack ---------------------------------------------- I'm a wooden duck ---------------------------------------------- I am an exclusive duck I spew flame <== exclusive behavior ---------------------------------------------- ############################################## 2 Kriyaaaaaaaa! <== replaced in Runtime I fly Quack quack quack ---------------------------------------------- ############################################## 3 Zzzz ^^^^^ aftermath O_o ^^^^^ aftermath I mallard ^^^^^ aftermath I fly ^^^^^ aftermath Quack quack quack ^^^^^ aftermath ---------------------------------------------- ############################################## four ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- I spew flame <== exclusive behavior ----------------------------------------------
Source: https://habr.com/ru/post/350386/
All Articles